Удалить библиотеку, добавленную с помощью link_libraries () - PullRequest
0 голосов
/ 01 октября 2019

Как удалить библиотеки, добавленные с link_libraries()?

Да, я знаю, что должен использовать target_link_libraries(). Я не могу, потому что я должен связать библиотеку с каждой будущей целью. Смотрите это . Библиотека построена на CMake. Это должно быть невидимым для разработчика C ++ / CMake. Ему не нужно беспокоиться об этой библиотеке. Пример:

add_library(link-to-all a.cpp)
link_libraries(link-to-all)
add_executable(e1 e1.cpp) # with link-to-all
add_executable(e2 e2.cpp) # with link-to-all
unlink_libraries(link-to-all) #does not exist!
add_executable(e3 e3.cpp) # without link-to-all
# all further targets link without link-to-all!

В моем случае link-to-all - это библиотека с реализацией для функций проверки покрытия. Он включается в зависимости от параметра конфигурации и должен неявно использоваться для всех будущих целей. Анализ покрытия может быть отключен для конкретных целей, поэтому я хочу иметь возможность отключить его.

Покрытие включается с помощью добавления CMAKE_<LANG>_COMPILE_OBJECT и отключается при удалении префикса. Afaik это не может быть сделано для конкретных целей, только глобальные для будущих целей. Так что unlink_libraries() будет функцией, которую я могу вызывать симметрично.

function(enable_coverage)
   prepend_compiler();
   link_libraries(cov);
   # alternative with loosing target information/dependency
   # prepend_system_libs(<path>/libcov.a)
endfunction()
function(disable_coverage)
   reset_compiler();
   unlink_libraries(cov);
   # reset_system_libs()
endfunction()

Я мог бы использовать CMAKE_<LANG>_STANDARD_LIBRARIES, (и также удалить ее там), но мне понадобится LOCATION библиотеки (генераторавыражение: TARGET) там. Но я бы тоже потерял интерфейсы link-to-all. Кроме того, это, вероятно, удалит зависимости сборки.

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

Хотя я согласен с @Guillaume, я объединю предложения в ответ, так как связанный ответ не очень понятен. Как @Csyvarev подтвердил в источнике CMake , вызов link_libraries() устанавливает целевое свойство LINK_LIBRARIES;target_link_libraries() вызов делает то же самое. Хотя ваш исполняемый файл e3 изначально будет настроен для связи со всеми библиотеками, вы можете удалить одну (или несколько) библиотек из списка, используя комбинацию get_target_property() и set_property(). Вот пример, демонстрирующий, как:

# Library to be linked to all targets.
add_library(link-to-all a.cpp)
# Library to be linked to (almost) all targets.
add_library(link-to-almost-all b.cpp)

link_libraries(link-to-all link-to-almost-all)
# Gets our link-everywhere libraries. Oops!
add_executable(e3 test.cpp)

# Get the LINK_LIBRARIES property for this target.
get_target_property(E3_LINKED_LIBS e3 LINK_LIBRARIES)
message("Libraries linked to e3: ${E3_LINKED_LIBS}")

# Remove one item from the list, and overwrite the previous LINK_LIBRARIES property for e3.
list(REMOVE_ITEM E3_LINKED_LIBS link-to-almost-all)
set_property(TARGET e3 PROPERTY LINK_LIBRARIES ${E3_LINKED_LIBS})

# Verify only one library is now linked.
get_target_property(E3_LINKED_LIBS_NEW e3 LINK_LIBRARIES)
message("Libraries linked to e3: ${E3_LINKED_LIBS_NEW}")

Распечатанные здесь сообщения подтверждают, что библиотека была удалена из целевого свойства LINK_LIBRARIES для e3:

Libraries linked to e3: link-to-all;link-to-almost-all
Libraries linked to e3: link-to-all
0 голосов
/ 08 октября 2019

В качестве дополнительного ответа я повторяю то, что я прокомментировал, ответ на квадратные заголовки (для дальнейшего использования):

Вы должны использовать целевое свойство <LANG>_COMPILER_LAUNCHER вместо CMAKE_<LANG>_COMPILE_OBJECT. Может быть установлен на целевую базу.

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