У меня есть файл CMake в следующих строках:
add_library(foo SHARED foo.cpp)
target_link_libraries(foo
PRIVATE
bar::bar
)
В этом случае bar::bar
- это некоторая импортированная общая библиотека в системном расположении не по умолчанию, которое используется только в реализации foo
.
foo
строит и ссылки корректно. У меня проблема при использовании foo
в качестве зависимости для других библиотек. Например:
add_library(baz SHARED baz.cpp)
target_link_libraries(baz
PRIVATE
foo
)
Теперь это приводит к ошибкам компоновщика, поскольку компоновщик не может найти libbar.so
, который связан с libfoo.so
. Это можно решить, установив bar
PUBLIC
зависимость foo
, но я беспокоюсь, что это неправильное решение (как уже упоминалось, bar
используется только для реализации foo
).
Что было бы хорошим решением в этом случае? Я думаю, что использование target_link_directories
или link_directories
для добавления местоположения bar
может работать, но очевидно, что использование этих функций не одобряется, и поэтому я полагаю, что может быть лучшее решение этой проблемы?
Обновление : В конце концов я понял, что по умолчанию у CMake нет проблем с небольшим воспроизводимым случаем, как объяснено выше. CMake добавит местоположение bar
в качестве rpath в библиотеку foo
, гарантируя, что компоновщик найдет его, когда ему потребуется связать baz
, используя foo
.
В нашем случае у нас есть пользовательский CMAKE_INSTALL_RPATH
вместе с включенной опцией CMAKE_BUILD_WITH_INSTALL_RPATH
. Это отключает поведение CMake по умолчанию, вызывая проблемы со связыванием.
Я решил исправить это, установив пользовательский флаг -rpath-link
для компоновщика, чтобы он мог находить библиотеки в нестандартных местах, только во время сборки время. Например, это можно сделать следующим образом:
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath-link=${CMAKE_PREFIX_PATH}/lib")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-rpath-link=${CMAKE_PREFIX_PATH}/lib")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,-rpath-link=${CMAKE_PREFIX_PATH}/lib")