两个升压版本之间的冲突
Conflict between two boost versions
我在集群上安装了两个版本的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: warning: libboost_serialization.so.1.64.0, needed by
/truba/home/osibliyev/boost/lib/libboost_mpi.so, may conflict with
libboost_serialization.so.1.53.0 /usr/bin/ld: loadmap.o: undefined
reference to symbol '_ZN5boost7archive17archive_exceptionC2ERKS1_'
/truba/home/osibliyev/boost/lib/libboost_serialization.so.1.64.0:
error adding symbols: DSO missing from command line
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 抱怨。这不会发生在我只有一个增强版本的机器上。我该怎么做才能解决这个错误?
您的工具链 header 和库搜索路径的确定方式是 implementation-specific。对于哪些环境变量(如果有)会影响它们或如何影响它们,没有通用的规则。
您尝试使用的特定环境变量以及您为它们设置的值表示 UNIX-style 系统。你应该知道
- 在这样的系统上,
PATH
变量设置可执行文件的搜索路径,而不是库或 headers。
- 在那些识别它的系统上,
LD_LIBRARY_PATH
为 dynamic linker 的搜索路径指定额外的目录——这些在 运行 时间,不是构建时间。
CPLUS_INCLUDE_PATH
被 GNU C++ 编译器识别,也许还有其他编译器识别,用于指定额外的目录来搜索包含文件。这与您查找 Boost header 相关,但与库无关。对于 GNU 编译器,此变量中列出的目录将在标准目录之前被搜索。
LIBRARY_PATH
被 GNU linker 和其他人识别为指定额外的目录来搜索库。像 CPLUS_INCLUDE_PATH
,这与您相关,但它不允许您用您的库替换 like-named 在标准位置之一找到的其他库,因为标准目录在 之前被搜索这些。
您的错误消息表明 linker 正在寻找 Boost v1.53 和 v1.64 库的混合体。可能这意味着前者驻留在首先搜索的目录中——可能是系统目录,例如 /usr/lib
——但并不是所有你试图 link 的 Boost 库都在那里找到;有些可以在您的 v1.64 安装中找到。鉴于您已经尝试过的方法不起作用,您不太可能设置任何环境变量来解决这个问题。然而,正如我所说,它是 implementation-dependent,虽然我怀疑您使用的是 GNU 工具链,但您没有指定。
使用 GNU 工具链,如果您希望 linker 在搜索标准目录之前搜索您的个人 Boost 安装库,那么您需要通过 [=44 专门指示它这样做=] 选项。正如评论中所讨论的,您可以通过将 -L/truba/home/osibliyev/boost/lib
添加到您的 Automake LDADD
变量来实现。
我在集群上安装了两个版本的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: warning: libboost_serialization.so.1.64.0, needed by /truba/home/osibliyev/boost/lib/libboost_mpi.so, may conflict with libboost_serialization.so.1.53.0 /usr/bin/ld: loadmap.o: undefined reference to symbol '_ZN5boost7archive17archive_exceptionC2ERKS1_' /truba/home/osibliyev/boost/lib/libboost_serialization.so.1.64.0: error adding symbols: DSO missing from command line
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 抱怨。这不会发生在我只有一个增强版本的机器上。我该怎么做才能解决这个错误?
您的工具链 header 和库搜索路径的确定方式是 implementation-specific。对于哪些环境变量(如果有)会影响它们或如何影响它们,没有通用的规则。
您尝试使用的特定环境变量以及您为它们设置的值表示 UNIX-style 系统。你应该知道
- 在这样的系统上,
PATH
变量设置可执行文件的搜索路径,而不是库或 headers。 - 在那些识别它的系统上,
LD_LIBRARY_PATH
为 dynamic linker 的搜索路径指定额外的目录——这些在 运行 时间,不是构建时间。 CPLUS_INCLUDE_PATH
被 GNU C++ 编译器识别,也许还有其他编译器识别,用于指定额外的目录来搜索包含文件。这与您查找 Boost header 相关,但与库无关。对于 GNU 编译器,此变量中列出的目录将在标准目录之前被搜索。LIBRARY_PATH
被 GNU linker 和其他人识别为指定额外的目录来搜索库。像CPLUS_INCLUDE_PATH
,这与您相关,但它不允许您用您的库替换 like-named 在标准位置之一找到的其他库,因为标准目录在 之前被搜索这些。
您的错误消息表明 linker 正在寻找 Boost v1.53 和 v1.64 库的混合体。可能这意味着前者驻留在首先搜索的目录中——可能是系统目录,例如 /usr/lib
——但并不是所有你试图 link 的 Boost 库都在那里找到;有些可以在您的 v1.64 安装中找到。鉴于您已经尝试过的方法不起作用,您不太可能设置任何环境变量来解决这个问题。然而,正如我所说,它是 implementation-dependent,虽然我怀疑您使用的是 GNU 工具链,但您没有指定。
使用 GNU 工具链,如果您希望 linker 在搜索标准目录之前搜索您的个人 Boost 安装库,那么您需要通过 [=44 专门指示它这样做=] 选项。正如评论中所讨论的,您可以通过将 -L/truba/home/osibliyev/boost/lib
添加到您的 Automake LDADD
变量来实现。