我最近在超级计算机网格上有一个帐户,我正在尝试在theri系统中编译我的代码。问题是该程序不会与以下错误链接:
/mnt/opt/tools/slc6/binutils/2.22/bin/ld: warning: libboost_system.so.1.55.0, needed by /mnt/home/jbzdak/tools/boost_1_55//lib/libboost_thread.so, may conflict with libboost_system.so.5
/mnt/opt/tools/slc6/binutils/2.22/bin/ld: /mnt/home/jbzdak/tools/boost_1_55//lib/libboost_thread.so: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/mnt/opt/tools/slc6/binutils/2.22/bin/ld: note: '_ZN5boost6system15system_categoryEv' is defined in DSO /mnt/home/jbzdak/tools/boost_1_55//lib/libboost_system.so.1.55.0 so try adding it to the linker command line
/mnt/home/jbzdak/tools/boost_1_55//lib/libboost_system.so.1.55.0: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
这是因为我的程序需要提升1.55,并且/usr/lib64
中的系统只有1.39。我已经在本地文件夹中安装了我的boost版本,但不知何故仍然首先加载系统1。
以下摘录自传递给编译器的标志:
-std=gnu++11 -Werror -Wall -lboost_thread -lboost_filesystem -lboost_system -lboost_iostreams -g -DG4OPTIMISE -Iinclude
-W -Wall -ansi -pedantic -Wno-non-virtual-dtor -Wno-long-long -Wwrite-strings -Wpointer-arith -Woverloaded-virtual -pipe -O2
完整listing of flags is here(它们应该是无效的)。
以下是重要的配置变量:
LIBRARY_PATH /mnt/home/jbzdak/tools/boost_1_55/lib:
CPLUS_INCLUDE_PATH /mnt/home/jbzdak/tools/boost_1_55/include:/mnt/home/jbzdak/tools/geant4.9.6.3/compile/include/Geant4
LD_LIBRARY_PATH /mnt/home/jbzdak/tools/boost_1_55/lib:/mnt/opt/tools/slc6/gcc/4.8.3/lib64: ...
目录/mnt/home/jbzdak/tools/boost_1_55
包含已安装的boost库。
我使用GCC
4.8.3与ld
2.22。
我对链接器错误的经验很少,因此问题。有没有办法在/ usr / lib64中排除boost库,或者让链接器使用本地安装的库,并忽略系统库?
答案 0 :(得分:5)
我在评论中说:
没有显示
-L/alternative/location/of/boost/lib
,因此编译器(链接器)并不知道它需要查看现代Boost库的其他位置。您可能还需要-Wl,rpath,/alternative/location/of/boost/lib
。
问的问题是:
为什么没有
LD_LIBRARY_PATH
解决问题?
因为LD_LIBRARY_PATH
是运行时变量而不是链接时变量。它会影响/lib/ld.so.1
(或等效)动态加载程序在运行程序时查找库的位置,而不是链接器查找其库的位置。
答案 1 :(得分:0)
经过一些额外的调试并询问another question后,我发现了问题的根本原因。任何-L
参数都优先于LIBRARY_PATH
,并且添加了-L/usr/lib64
(因此它优先于我的版本)。
检查向gcc
传递-v
参数发送的选项。