Имеет ли cmake что-то вроде target_link_options?

Вы можете установить COMPILE_OPTIONS в библиотеке INTERFACE (foo) и эти COMPILE_OPTIONS будут также использоваться пользователями Foo.

add_library(foo INTERFACE)
target_link_libraries(foo INTERFACE foo_1)
target_compile_options(foo INTERFACE "-DSOME_DEFINE")
add_executable(exe exe.cpp)
target_link_libraries(exe foo)

Можно ли сделать что-то подобное для LINK_FLAGS?

Ответ 1

В соответствии с документацией нет такого свойства, как INTERFACE_LINK_OPTIONS или что-то еще. Вероятно, потому что INTERFACE_* свойства, используемые для описания того, как использовать цель (например, исключение нарушения правил ODR или ссылок undefined), и такие параметры, как --allow-multiple-definitions, не связаны с использованием конкретной библиотеки (IMHO это указание ошибки).

В любом случае, для компилятора типа gcc вы можете использовать target_link_libraries для добавления флагов компоновщика:

target_link_libraries(foo INTERFACE "-Wl,--allow-multiple-definition")

Но я не знаю, как сделать что-то подобное для визуальной студии.

Ответ 2

CMake имеет target_link_options, начиная с версии 3.13, которая делает именно это.

target_link_options(<target> [BEFORE]
  <INTERFACE|PUBLIC|PRIVATE> [items1...]
  [<INTERFACE|PUBLIC|PRIVATE> [items2...] ...])

target_link_options documentation

Ответ 3

Изменить: Современный CMake теперь предоставляет target_link_options(), как и отвечал здесь.


Вы можете попробовать что-то вроде этого:

add_library(foo INTERFACE)
target_link_libraries(foo INTERFACE foo_1)
target_compile_options(foo INTERFACE "-DSOME_DEFINE")
add_executable(exe exe.cpp)
target_link_libraries(exe foo)

set_target_properties(foo PROPERTIES LINK_FLAGS "My lib link flags")
set_target_properties(exe PROPERTIES LINK_FLAGS "My exe link flags")