Условное нахождение зависимостей разделяемой библиотеки в CMake - PullRequest
0 голосов
/ 20 января 2019

В Linux у меня есть общая библиотека somelib.so, которая может быть опционально скомпилирована с несколькими другими общими библиотеками, скажем, dep1 и dep2.Сейчас я пишу клиентское приложение, которое использует somelib, но заранее не знаю, было ли скомпилировано somelib с dep1 и dep2 или нет, пока не получит ошибку компоновщика.

Есть ли способ узнать это с помощью CMake?Мне нужно что-то вроде

IF somelib DEPEND ON dep1 THEN...

1 Ответ

0 голосов
/ 20 января 2019

... клиентское приложение, которое использует somelib, но я не знаю заранее, если somelib был скомпилирован с dep1 и dep2 ... Мне нужно что-то вроде

IF somelib DEPEND ON dep1 THEN...

В Linux я считаю, что способ решить эту проблему - использовать параметры линкера LD -Wl,--exclude-libs,ALL и -Wl,--as-needed.

Всегда включать -ldep1 и -ldep2 в качестве параметров библиотеки.Затем используйте -Wl,--as-needed, чтобы исключить библиотеки, если они не нужны.

Если я правильно помню, этот трюк датируется 20 или 30 годами для математической библиотеки -lm.Иногда математические символы были включены в glibc, а другие - в -lm.Таким образом, вы всегда связывались с -lm и позволяли компоновщику отбрасывать библиотеку -lm с помощью -Wl,--as-needed.

На самом деле ld(1) man-страница говорит о состоянии push и popпри использовании трюка:

Одной целью для этого параметра являются спецификации для pkg-config.При использовании с параметром --libs перечислены все возможные библиотеки, которые затем могут быть связаны со всеми.Лучше вернуть что-нибудь следующим образом:

 -Wl,--push-state,--as-needed -libone -libtwo -Wl,--pop-state

-Wl,--exclude-libs,ALL - это опция, которая не позволяет вам реэкспортировать символы из -ldep1 и -ldep2.Если библиотеки не используются, то вам не нужно -Wl,--exclude-libs,ALL.

Я считаю, что две настройки CMake для статической библиотеки и общего объекта при сборке somelib.so:

set(OUR_LINKER_FLAGS "-Wl,--exclude-libs,ALL -Wl,--as-needed -ldep1 -ldep2")
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${OUR_LINKER_FLAGS}")
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${OUR_LINKER_FLAGS}")

Также см. ld(1) справочную страницу , CMAKE_MODULE_LINKER_FLAGS и CMAKE_SHARED_LINKER_FLAGS в документации CMake.Вас также может заинтересовать CMAKE_EXE_LINKER_FLAGS , если вы создаете исполняемые файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...