【发布时间】:2018-01-19 15:05:58
【问题描述】:
假设我有这 2 个具有 相同 名称的库,/usr/local/lib/libxxx.so 和 /opt/lib/libxxx.so。 /usr/local/lib/ 和 /opt/lib 必须在搜索路径上(链接器才能找到其他所需的库)。应该为链接器指定什么(ld,not 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 两个搜索路径中查找它。
【问题讨论】: