GNU链接器ld - 链接到特定位置的库

时间:2018-01-19 15:05:58

标签: gcc linker

假设我有这两个带有相同名称的库,/usr/local/lib/libxxx.so/opt/lib/libxxx.so/usr/local/lib//opt/lib 都必须在搜索路径上(链接器才能找到其他所需的库)。应该为链接器(ld而不是 ld.so)指定什么,以便找到/opt/lib/下的正确链接?

已添加2018-01-23 21:17(UTC + 8)

是的,这也是我的理解,虽然我没有完全理解“所有-L选项适用于所有-l选项,无论选项出现的顺序”是什么意思。

这是详细信息。 configure脚本创建的链接选项(对不起,有点难以阅读)是

-lz -Wl,-rpath,/opt/moose/tbb44_20150728/lib -L/opt/moose/tbb44_20150728/lib -ltbb -ltbbmalloc -L/opt/moose/petsc-3.7.6/mpich-3.2_gcc-7.2.0-opt/lib -Wl,-rpath,/opt/moose/petsc-3.7.6/mpich-3.2_gcc-7.2.0-opt/lib -L/opt/moose/mpich-3.2/gcc-7.2.0/lib -L/opt/moose/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0 -L/opt/moose/gcc-7.2.0/lib64 -L/opt/moose/gcc-7.2.0/lib -lpetsc -lsuperlu_dist -lcmumps -ldmumps -lsmumps -lzmumps -lmumps_common -lpord -lparmetis -lmetis -lHYPRE -lscalapack -lflapack -lfblas -lX11 -lmpifort -lgfortran -lquadmath -lmpicxx -lstdc++ -lm -Wl,-rpath,/opt/moose/gcc-7.2.0/lib/gcc/x86_64-pc-linux-gnu/7.2.0 -Wl,-rpath,/opt/moose/gcc-7.2.0/lib64 -Wl,-rpath,/opt/moose/gcc-7.2.0/lib -Wl,-rpath,/opt/moose/mpich-3.2/gcc-7.2.0/lib -lmpi -lgomp -lgcc_s -lpthread -ldl -L/lib/x86_64-linux-gnu -L/usr/lib/x86_64-linux-gnu -Wl,-rpath,/lib/x86_64-linux-gnu -Wl,-rpath,/usr/lib/x86_64-linux-gnu

这是链接器在链接测试二进制文件时尝试查找libmetis.so时的错误消息

/usr/bin/ld: gk_cur_jbufs: TLS definition in /usr/lib/x86_64-linux-gnu/libmetis.so.5 section .tdata mismatches non-TLS definition in /opt/moose/petsc-3.7.6/mpich-3.2_gcc-7.2.0-opt/lib/libmetis.so section .data /usr/lib/x86_64-linux-gnu/libmetis.so.5: error adding symbols: Bad value collect2: error: ld returned 1 exit status Makefile:1368: recipe for target 'unit_tests-dbg' failed

根据搜索顺序,我不明白为什么它会尝试在/opt/moose/petsc-3.7.6/mpich-3.2_gcc-7.2.0-opt/lib/usr/lib/x86_64-linux-gnu两个搜索路径中查找。

1 个答案:

答案 0 :(得分:0)

按顺序使用-L /opt/lib -L /usr/local/lib,首先搜索/ opt / lib。

文档说:

  

-L searchdir   将路径searchdir添加到ld将搜索的路径列表中   归档库和ld控制脚本。您可以使用此选项   次数。按顺序搜索目录              它们是在命令行中指定的。在默认情况下搜索命令行中指定的目录   目录。