我在群集上安装了两个版本的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:警告:libboost_serialization.so.1.64.0,需要 /truba/home/osibliyev/boost/lib/libboost_mpi.so,可能与 libboost_serialization.so.1.53.0 / usr / bin / ld:loadmap.o:undefined 参考符号' _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
我确信错误是因为冲突,因为其他库没有问题链接,只会助长抱怨。这种情况不会发生在只有一个升级版本的机器上。我该怎么做才能解决这个错误?
答案 0 :(得分:1)
如何确定工具链的标头和库搜索路径是特定于实现的。对于哪些环境变量(如果有)影响它们或如何影响,没有通用规则。
您尝试使用的特定环境变量以及为其设置的值表示UNIX样式的系统。你应该知道
PATH
变量设置可执行文件的搜索路径,而不是库或标题。LD_LIBRARY_PATH
为动态链接器的搜索路径指定了额外的目录 - 这些目录在运行时相关,而不是构建时。CPLUS_INCLUDE_PATH
被GNU C ++编译器以及其他人识别,用于指定其他目录以搜索包含文件。这与您查找Boost标头有关,但与查找库无关。使用GNU编译器,将在标准目录之前搜索此变量中列出的目录。LIBRARY_PATH
被GNU链接器以及可能的其他人识别为指定用于搜索库的其他目录。与CPLUS_INCLUDE_PATH
类似,这与您相关,但它不允许您将库替换为在其中一个标准位置找到的同名的其他库,因为标准目录在之前这些。您的错误消息表明链接器正在查找Boost v1.53和v1.64库的混合。可能这意味着前者驻留在首先搜索的目录中 - 可能是系统目录,例如/usr/lib
- 但是并不是所有你想要链接的Boost库都在那里找到;在v1.64安装中找到了一些。鉴于您已经尝试过的功能不起作用,您可能无法设置任何环境变量来修复它。然而,正如我所说,它依赖于实现,虽然我怀疑你使用的是GNU工具链,但你还没有指定。
使用GNU工具链,如果您希望链接器在搜索标准目录之前搜索您的个人Boost安装库,那么您需要通过命令行选项专门指示它。如评论中所述,您可以通过将-L/truba/home/osibliyev/boost/lib
添加到Automake LDADD
变量来实现这一目标。