Я использую в своем проекте внешнюю общую библиотеку. Я написал искатель, который успешно находит библиотеку и создает цель зависимости
...
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)
Build работает нормально, но когда я смотрю на ldd info, я вижу
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 практически идентичен. Они расположены на одном диске в соседних папках. вывод команды file также кажется разумным:
ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, not stripped
Я не использую странные флаги или политики компиляции. В чем может быть проблема?
Всего 1 ответ
Как бы странно это ни звучало, потому что в mylib.so не было объявлено SONAME
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
...