... клиентское приложение, которое использует 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 , если вы создаете исполняемые файлы.