我在集群上安装了两个版本的 boost。旧的位于标准位置,而新的位于我的主目录中。由于我没有 su 权限,因此无法删除旧的权限。我为 boost(和其他库)导出了环境变量,如下所示:
export PATH=/truba/home/osibliyev/boost/bin:$PATH
export LD_LIBRARY_PATH=/truba/home/osibliyev/boost/lib:$LD_LIBRARY_PATH
export LIBRARY_PATH=/truba/home/osibliyev/boost/lib:$LIBRARY_PATH
export CPLUS_INCLUDE_PATH=/truba/home/osibliyev/boost/include:$CPLUS_INCLUDE_PATH
编译后make
,我在链接阶段收到以下错误:
/usr/bin/ld: 警告:/truba/home/osibliyev/boost/lib/libboost_mpi.so 需要的 libboost_serialization.so.1.64.0,可能与 libboost_serialization.so.1.53.0 /usr/bin/ld 冲突:loadmap.o:未定义对符号“_ZN5boost7archive17archive_exceptionC2ERKS1_”的引用/truba/home/osibliyev/boost/lib/libboost_serialization.so.1.64.0:添加符号时出错:命令行中缺少DSO
lboost_serialization
已经添加到LDADD
:
LDADD = -lmetis -lmpi -lboost_mpi -lboost_serialization -lboost_log -lboost_log_setup -lboost_thread -lpthread -lboost_date_time -lboost_filesystem -lboost_system -lboost_timer
我有点确定错误是因为冲突,因为其他库链接没有问题,只有 boost 抱怨。这不会发生在我只有一个 boost 版本的机器上。我能做些什么来解决这个错误?
如何确定工具链的标头和库搜索路径是特定于实现的。对于哪些环境变量(如果有)影响它们或如何影响它们,没有通用规则。
您尝试使用的特定环境变量以及您为它们设置的值表示 UNIX 风格的系统。你应该知道
PATH
变量设置可执行文件的搜索路径,而不是库或头文件。LD_LIBRARY_PATH
为动态链接器的搜索路径指定额外的目录——这些在运行时是相关的,而不是构建时。CPLUS_INCLUDE_PATH
被 GNU C++ 编译器或其他编译器识别,用于指定额外的目录来搜索包含文件。这与您查找 Boost 头文件有关,但与库无关。对于 GNU 编译器,将在搜索标准目录之前搜索此变量中列出的目录。LIBRARY_PATH
被 GNU 链接器和其他可能的链接器识别为指定额外的目录来搜索库。Like CPLUS_INCLUDE_PATH
,这与您有关,但它不允许您将库替换为在标准位置之一中找到的同名其他库,因为在这些库之前搜索了标准目录。您的错误消息表明链接器正在发现 Boost v1.53 和 v1.64 库的混合。可能这意味着前者驻留在首先搜索的目录中——可能是一个系统目录,例如/usr/lib
——但并非您尝试链接的所有 Boost 库都在那里找到;有些可以在您的 v1.64 安装中找到。鉴于您已经尝试过的方法不起作用,您不太可能设置任何环境变量来解决该问题。然而,正如我所说,它依赖于实现,虽然我怀疑您正在使用 GNU 工具链,但您尚未指定。
使用 GNU 工具链,如果您希望链接器在搜索标准目录之前搜索您的个人 Boost 安装库,那么您需要通过命令行选项专门指示它这样做。正如评论中所讨论的,您可以通过添加-L/truba/home/osibliyev/boost/lib
到 AutomakeLDADD
变量来实现这一点。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句