cmake: добавить параметры компоновщика / архива до и после определенной цели

#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()