假设我有这两个带有相同名称的库,/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
两个搜索路径中查找。
答案 0 :(得分:0)
按顺序使用-L /opt/lib -L /usr/local/lib
,首先搜索/ opt / lib。
文档说:
-L searchdir 将路径searchdir添加到ld将搜索的路径列表中 归档库和ld控制脚本。您可以使用此选项 次数。按顺序搜索目录 它们是在命令行中指定的。在默认情况下搜索命令行中指定的目录 目录。