#c #c #cmake #linkage
#c #c #cmake #привязка
Вопрос:
У меня есть библиотека, символы которой должны быть импортированы в приложение, несмотря на то, что они там явно не используются. Цель библиотеки — выполнить статические конструкторы и, таким образом, сделать себя доступной для приложения во время выполнения (зарегистрировать его символы).
Я нашел соответствующие флаги (gcc): -Wl,--no-as-needed
для разделяемой библиотеки и --whole-archive
для статического. В cmake я могу установить переменной LINK_WHAT_YOU_USE
--no-as-needed
флаг управления, и STATIC_LIBRARY_OPTIONS
они будут применены ко всем библиотекам, перечисленным далее. Что мне нужно, так это применить их только для одной конкретной библиотеки, т.е. -Wl,--no-as-needed -lmylib -Wl,--as-needed
и -Wl,--whole-archive -lmylib -Wl,--no-whole-archive
.
Как это сделать с помощью cmake кроссплатформенным способом?
UPD. Я нашел способ сделать это, но он недостаточно «кроссплатформенный»:
target_link_libraries(
myapp PRIVATE
"-Wl,--no-as-needed -Wl,--whole-archive" mylib "-Wl,--as-needed -Wl,--no-whole-archive")
Это работает в Linux (ld), но я сомневаюсь, что это будет на Windows / mac. Есть ли способ сделать то же самое без жестко закодированных строк с использованием функций / переменных cmake?
Комментарии:
1. Привет, у меня такая же проблема. Я уже пробовал тот же способ, что и вы, но не смог запустить его. У меня следующая настройка:
CMAKE: target_link_libraries(myapp -Wl,--no-as-needed mylib1 -Wl--as-needed mylib2)
когда я проверяю динамические разделы ELF,mylib1
импортируются символы, но также и символы дляmylib2
2. Привет, @moatze. Забудьте запятую после второго флага Wl,
-Wl,--as-needed
, не так ли?3. извините мою ошибку. Я поставил запятую,
CMAKE: target_link_libraries(myapp -Wl,--no-as-needed mylib1 -Wl,--as-needed mylib2)
проблема все равно существует.
Ответ №1:
Есть ли способ сделать то же самое без жестко закодированных строк с использованием функций / переменных cmake?
На данный момент нет, нет. Вы должны написать -Wl,--whole-archive
сами.
Я считаю, что было бы неплохо иметь некоторые set_target_properties(static_target PROPERTIES WHOLE_ARCHIVE true)
в cmake, но я также предполагаю, что реализация может быть сложной.
Если вы хотите быть кроссплатформенным, вы должны это обнаружить:
check_c_compiler_flag('-Wl,--whole-archive' has_whole_archive)
if (has_whole_archive)
use_it(-Wl,--whole-archive)
endif()