Исполняемый файл Cmake не может связываться с новой библиотекой интерфейса в зависимости от другой библиотеки - PullRequest
1 голос
/ 23 апреля 2019

У меня есть следующие зависимости:

add_library(lib)
add_library(ilib INTERFACE)
add_dependencies(ilib lib)
target_link_libraries(ilib INTERFACE
      "-Wl,--whole-archive $<TARGET_FILE:lib> Wl,--no-whole-archive")
add_executable(exe ilib)

Когда я изменил некоторые исходные коды lib, библиотека, как и ожидалось, была скомпилирована и собрана снова. Однако exe не связывал новый lib. Если я использую add_executable(exe lib), то exe всегда будет связывать новый lib. (Причина, по которой я использую ilib, заключается в том, что мне нужно обработать lib перед его использованием.)

1 Ответ

1 голос
/ 23 апреля 2019

Вы ожидаете, что lib будет распространяться, когда кто-то связывается с ilib.

Но команда add_dependencies не добавляет свойства для распространения.Вам нужно

# Linking with `ilib` will transitively link with a `lib`
target_link_libraries(ilib INTERFACE lib)

Когда нужно использовать опцию --whole-archive для компоновщика, это может быть сделано следующим образом:

target_link_libraries(ilib INTERFACE "-Wl,--whole-archive" lib "Wl,--no-whole-archive")

Когда анализирует аргументы для данной функции, CMake найдетаргумент lib должен быть целевым именем , и он добавит правильную file-level зависимость.С этой зависимостью исполняемый файл будет перекомпонован при каждом изменении файла библиотеки.

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