CMake `target_link_libraries` с общими библиотеками PRIVATE в нестандартных местах - PullRequest
1 голос
/ 28 апреля 2020

У меня есть файл 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...