CMake为什么通过相对路径链接外部库

Why does CMake links external library by relative path?

本文关键字:链接 外部 路径 相对 为什么 CMake      更新时间:2023-10-16

我在我的项目外部共享库中使用。我写了一个成功定位库并创建依赖性目标

的发现器
...
set(_target MyLib)
add_library(${_target} UNKNOWN IMPORTED)
set_target_properties(${_target}
    PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${MYLIB_INCLUDE_DIRS}")
set_property(TARGET ${_target}
    APPEND PROPERTY IMPORTED_LOCATION "${MYLIB_LIBRARIES}")
...
message("${MYLIB_LIBRARIES}")
> /absolute/path/to/mylib.so

我使用此库定义了一个目标,其他库

add_library(my_final_target SHARED
    mysource.cpp
    PRIVATE
    MyLib
    SomeOtherLib)

构建性能还可以,但是当我查看 ldd 信息时,我会看到

ldd my_final_target.so
...
    some_other_lib.so -> /absolute/path/to/some_other_lib.so
    ../../../some/relative/path/mylib.so
...

mylib.so和some_other_lib.so的查找器代码几乎相同。它们位于邻居文件夹中的同一磁盘上。文件命令输出似乎也合理:

ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, not stripped

我没有使用奇怪的汇编标志或政策。问题可能是什么?

听起来很奇怪,因为mylib。

objdump -p mylib.so | grep SONAME
> 
objdump -p some_other_lib.so | grep SONAME
> SONAME        some_other_lib.so

我用

修复了soname
patchelf --set-soname mylib.so mylib.so

现在很好:

ldd my_final_target.so
...
    some_other_lib.so -> /absolute/path/to/some_other_lib.so
    mylib.so -> /absolute/path/to/mylib.so
...

编辑:重复。看到这个问题。我的Google Fu使我失望...