如何应对sysadmin在`/ usr / lib`中安装的旧库

时间:2014-06-12 16:11:19

标签: c++ c ld

我最近在超级计算机网格上有一个帐户,我正在尝试在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库,或者让链接器使用本地安装的库,并忽略系统库?

2 个答案:

答案 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参数发送的选项。