【问题标题】:Does cmake have something like target_link_options?cmake 有类似 target_link_options 的东西吗?
【发布时间】:2014-09-22 11:40:44
【问题描述】:

您可以在 INTERFACE 库 (foo) 上设置 COMPILE_OPTIONS 并且那些 COMPILE_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)

是否可以为 LINK_FLAGS 做类似的事情?

【问题讨论】:

标签: cmake


【解决方案1】:

CMake 有一个 target_link_options 从版本 3.13 开始完全做到这一点。

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

target_link_options documentation

【讨论】:

  • 在 AndroidStudio 中使用 3.6.4111459,我得到:未知的 CMake 命令“target_link_options”。
  • @Bram 您需要将版本至少升级到 3.13 版。检查以下问题:stackoverflow.com/questions/51471908/…
【解决方案2】:

根据documentation 没有INTERFACE_LINK_OPTIONS 之类的属性。可能是因为 INTERFACE_* 用于描述如何使用目标的属性(例如避免违反 ODR 规则或未定义的引用)以及像 --allow-multiple-definitions 这样的选项与特定库的使用无关(恕我直言,这是错误的指示)。

无论如何,对于像 gcc 这样的编译器,您也可以使用 target_link_libraries 添加链接器标志:

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

但我不知道如何为 Visual Studio 做类似的事情。

【讨论】:

  • 那行得通。对于 windows*,我希望将“-Wl,--allow-multiple-definition”替换为“/FORCE:multiple”。 * msdn.microsoft.com/en-us/library/70abkas3.aspx
  • 我认为还有另一个用例。例如使用 LD:--undefined=symbol 或 --allow-shlib-undefined。我认为它没有添加到 CMake 中,因为它更容易让编译器不可知(定义)而不是将链接器选项映射到 INTERFACE_* 属性?
  • @ruslo: 使用- 而不是/ 用于cl.exe 链接器选项,cl.exe 接受两者,并以- 开头避免误解为库名称
  • target_link_libraries(foo PRIVATE optimized -LTCG optimized -INCREMENTAL:NO) 适用于Microsoft Visual Studio Community 2017, Version 15.6.4 和 CMake 3.11
【解决方案3】:

编辑:Modern CMake 现在提供target_link_options(),回复here


你可以试试这样的:

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")

【讨论】:

    猜你喜欢
    • 2017-07-15
    • 2010-11-29
    • 2020-03-26
    • 2011-10-18
    • 2023-03-09
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多