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

C++ 为什么CMake通过相对路径链接外部库?,c++,linux,cmake,shared-libraries,C++,Linux,Cmake,Shared Libraries,我在我的项目中使用外部共享库。我编写了一个finder,它成功地定位了库并创建了依赖目标 ... set(_target MyLib) add_library(${_target} UNKNOWN IMPORTED) set_target_properties(${_target} PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${MYLIB_INCLUDE_DIRS}") set_property(TARGET ${_target} APP

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

...
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和其他一些lib.so的查找程序代码几乎相同。它们位于相邻文件夹中的同一磁盘上文件命令输出似乎也很合理:

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

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

听起来很奇怪,因为mylib.so中没有声明SONAME

objdump -p mylib.so | grep SONAME
> 
objdump -p some_other_lib.so | grep SONAME
> SONAME        some_other_lib.so
我给我安排了

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让我失望了…

这太奇怪了。从来没有考虑过这种副作用。我花了两天时间才弄明白。