【问题标题】:Conflict between two boost versions两个升压版本之间的冲突
【发布时间】:2017-06-05 15:26:53
【问题描述】:

我在集群上安装了两个版本的 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: 未定义 引用符号'_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 版本的机器上。我该如何解决这个错误?

【问题讨论】:

  • 如果你在 SO 上搜索 DSO missing from command line,你会得到一堆可能的答案。你已经读过它们了吗?这看起来很像一个重复的问题。 Here 可能会对您有所帮助。
  • @skypjack 是的,我搜索了类似的问题,但没有一个能解决我的问题。此外,该问题仅发生在集群中,而不发生在我的 PC 中。这让我觉得问题在于存在两个提升版本,但不知道如何摆脱旧版本。
  • 问题不在于更新旧版本,而是选择新版本。据我所知,您描述设置的所有环境变量都不会产生这种效果。相反,您希望在指定 Boost 库的任何 -l 选项之前将 -L/truba/home/osibliyev/boost/lib 选项添加到 LDADD。但是,您在 运行 时需要LD_LIBRARY_PATH
  • @JohnBollinger 您的解决方案有效。但是哪个环境变量可以做同样的功能呢?顺便说一句,您可能想回答,以便我选择它作为最佳答案。

标签: c++ boost autotools


【解决方案1】:

如何确定工具链的标头和库搜索路径是特定于实现的。对于哪些环境变量(如果有)会影响它们或如何影响它们,没有通用规则。

您尝试使用的特定环境变量以及您为它们设置的值表示 UNIX 风格的系统。你应该知道

  • 在这样的系统上,PATH 变量设置可执行文件的搜索路径,而不是库或头文件。
  • 在那些识别它的系统上,LD_LIBRARY_PATHdynamic 链接器的搜索路径指定额外的目录 - 这些在运行时相关,而不是在构建时相关。
  • 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 安装中的库,那么您需要通过命令行选项专门指示它这样做。正如 cmets 中所讨论的,您可以通过将 -L/truba/home/osibliyev/boost/lib 添加到您的 Automake LDADD 变量来完成此操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-08
    • 2011-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    相关资源
    最近更新 更多