【发布时间】:2015-03-10 11:14:03
【问题描述】:
我正在尝试链接已编译的research experiment project,内置于 C/C++ 中。 该项目依赖HyperNEAT和机器人仿真软件WeBots。 我已经成功克隆并构建了 HyperNEAT 项目(在该项目中还有其他依赖项,例如 Boost、TinyXML、JGTL(自定义库)和其他不相关的子项目)。
我制作了一个包含所有必要的头文件搜索路径和库路径的 makefile,并编译了两个主要的 .cpp 文件:
/ModHyperNEAT/mod_ctrler7.cpp
/ModSupervisor/mod_supervisor.cpp
有效,给我 2 个 .o 文件。
但是,在 make link 步骤中,当我想为这两个文件创建(单独的)可执行文件时,我收到了“undefined symbols for architecture x86_64”错误(请参阅此处的 pastebin:http://pastebin.com/kiwwCcUf)。似乎 C++ 标准数据类型和函数,如
找不到std::string::end() const。
我已经用谷歌搜索并搜索了有关此问题的答案,如果我理解正确,似乎库丢失或二进制不兼容,但库在那里并且两个项目都已使用 -lstdc++ 标志编译。
这是生成链接步骤(以及生成文件中使用的宏):
CC = gcc
CFLAGS = -v -g -lstdc++ -Wall -Wno-error -ferror-limit=100 -fmessage-length=0
DEFINES = -DHCUBE_NOGUI -DTIXML_USE_STL
FLAGS = $(CFLAGS) $(DEFINES)
LIB_TINYXML = -L/Users/michahell/Documents/projects_c++/HyperNEAT/tinyxmldll/out
LIB_HYPERNEAT = -L/Users/michahell/Documents/projects_c++/HyperNEAT/NE/HyperNEAT/out
LIB_BOOST = -L/usr/local/Cellar/boost/1.57.0/lib
LIB_WEBOTS = -I/Applications/Webots/lib
LIBS = $(LIB_TINYXML) $(LIB_HYPERNEAT) $(LIB_BOOST) $(LIB_WEBOTS)
LIBFLAGS = -ltinyxmlpluslib -lboost_filesystem-mt -lboost_random-mt -lboost_system-mt -lNEATLib_d -lHypercube_NEAT_Base_d
WEBOTS_DYLIB = -dylib_file /Applications/Webots/lib/libController.dylib:/Applications/Webots/lib/libController.dylib
$(CC) $(FLAGS) $(LIBS) ./mod_ctrler7.o $(WEBOTS_DYLIB) $(LIBFLAGS)
我发现要链接到 .dylib 的,我必须使用特定标志并指定完整路径,因此需要使用 $(WEBOTS_DYLIB) 宏。
我正在使用-lstdc++ 标志,因为在 HyperNEAT 项目中,该标志也用于构建该库。如果我排除这个标志,我会在编译过程中遇到很多错误(我现在理解的 libc++ 和 libstdc++ 不兼容)。检出所有库路径,并且存在 .a 和/或 .dylib 文件。
我对 C/C++ 和 GCC 工具的了解非常有限,因为我以前从未使用过它。 我认为这可能与 HyperNEAT 项目包含用于构建的 Boost 1.57.0 发行版有关,并且我的系统上安装了一个单独的(使用自制软件)Boost 版本,这是相同的版本:
$ brew info boost
boost: stable 1.57.0 (bottled), HEAD
http://www.boost.org
/usr/local/Cellar/boost/1.57.0 (10572 files, 439M) *
我的链接步骤失败导致此错误的原因可能是什么?如果 HyperNEAT 和 my project 都被克隆并将它们的根目录放在同一位置,任何人都应该能够重现我的链接器错误。应该下载 WeBot,但仅限于标头包含和库。当然,我的 makefile 路径也应该修改。
如果有人能告诉我如何解决这个问题,我将不胜感激!
【问题讨论】:
-
与其手动链接
stdc++,不如简单地使用自动处理的g++构建您的C++ 代码? -
我没有很好的答案,因为我不熟悉 C/C++ 构建工具的复杂性,我现在会尝试这样做,看看是否有任何变化。
-
我已将 GCC 替换为 G++ 并删除了 lstdc++ 标志。至少对于链接步骤,没有任何变化,不幸的是错误仍然存在:/
-
可以复制到stackoverflow.com/questions/25020140/…。我怀疑 boost 和其他库在 Mac 上混合了 libc++ 和 libstdc++。尝试按照显式 stdlib 选择的建议重建 boost。
标签: c++ gcc boost makefile linker-errors