LINUX.ORG.RU

cmake, gcc, linux: Слинковаться с одной из библиотек статически.

 , ,


2

3

Допустим имеется программа, зависящая от liba, libb, libd. Какой является рекомендованный и самый простой способ слинковаться с liba и libb динамически, а с libd статически?

Все библиотеки установлены в системе пакетным менеджером, информация о флагах получается из pkg-config, порядок линковки может быть любой. Из pkg-config даже если передаем --static мы чаще всего получаем флаг линковки вида -ld, ничем не отличающийся от динамической линковки. Оный необходимо либо обернуть будет в -Wl,-bstatic -Wl,bdynamic.

Тогда вопрос вырождается в то, что совершенно непонятно, как заставить CMake передать компилятору такое заклинание и не наплодить говногода в CMakeLists.txt (В идеале не отказываясь от target_link_libraries)

Или лучше линковаться с libd.a просто добавляя этот файл к add_executable(blah main.c /path/to/libd.a). Но тогда не понятно, как от pkg-config получить путь и имя .a файла и какие предположения можно делать, чтобы было максимально переносимо между дистрибутивами.

★★★★★

Сильно сомневаюсь, что pkg-config вообще предназначен для статической линковки какой-то части библиотек. Либо всё статикой, либо всё по умолчанию. Там этот static скорее для подтягивания зависимостей конкретной библиотеки.

Гуглинг предлагает:

ADD_LIBRARY(boost_unit_test_framework STATIC IMPORTED)
SET_TARGET_PROPERTIES(boost_unit_test_framework PROPERTIES
    IMPORTED_LOCATION /usr/lib/libboost_unit_test_framework.a)
TARGET_LINK_LIBRARIES(mytarget A boost_unit_test_framework C)

Для поиска статических версий использовать:

find_library(MYLIB NAMES libmylib.a)

не наплодить говногода в CMakeLists.txt

Хе-хе.

i-rinat ★★★★★ ()

Тогда вопрос вырождается в то, что совершенно непонятно, как заставить CMake передать компилятору такое заклинание и не наплодить говногода в CMakeLists.txt (В идеале не отказываясь от target_link_libraries)

Во-первых, target_link_libraries() принимает в т. ч. произвольные флаги компоновщика. Так что ты вполне можешь сделать target_link_libraries(foo -Wl,-Bstatic a b -Wl,-Bdynamic d). Можно в нескольких вызовах — в отличие от add_definitions, add_compile_options и т. д., здесь гарантируется, что взаимный порядок флагов и библиотек будет сохранён.

Во-вторых, если ты используешь find_library() (что, в принципе, стоило бы делать в любом случае), можно попросить его искать только статические или только динамические библиотеки, явно задав переменную FIND_LIBRARY_SUFFIXES.

Если у тебя новый CMake (>= 3.6), для взаимодействия с pkg-config рекомендую использовать модуль FindPkgConfig с ключом IMPORTED_TARGET (pkg_check_modules(FOO IMPORTED_TARGET foo)), который внутри себя дополнительно делает find_library для проверки вывода pkg-config, и соответственно на который можно влиять установкой FIND_LIBRARY_SUFFIXES.

intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 7)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.