【问题标题】:Using CMake generator expressions to link if target exists如果目标存在,则使用 CMake 生成器表达式进行链接
【发布时间】:2021-06-19 00:30:23
【问题描述】:

我有这个 CMakeLists.txt sn-p:

if (TARGET bar)
  target_link_libraries(foo PUBLIC bar)
else()
  target_link_libraries(foo PUBLIC baz)
endif()

我想我可以使用 CMake 的生成器表达式来缩短它。我该怎么做?

我试过了:

target_link_library(foo PUBLIC $<IF:$<TARGET_EXISTS:bar>,bar,baz> )

但实际上,foo 似乎没有链接到任何一个库。

【问题讨论】:

  • 在if() sn-p 中使用PUBLIC 关键字,但在带有正则表达式的snipper 中使用INTERFACE 关键字。后一个关键字仅影响库的消费者,而不影响库本身。
  • @Tsyvarev 好点,但不幸的是这不是问题。我的猜测是 conditional expressions 和 $&lt;IF:condition,true_string,false_string&gt; 一样只适用于字符串而不适用于目标。
  • 我已将您的尝试 - target_link_library(foo PUBLIC $&lt;IF:$&lt;TARGET_EXISTS:bar&gt;,bar,baz&gt; ) 复制粘贴到简单的 CMakeLists.txt 中并发现它有效:根据 bar 库目标的存在,它与 bar 或 @ 链接987654333@。我的 CMake 是 3.16。
  • 是的,你是对的。我一定是在刷新我的 CMakeCache 或其他东西时遇到了问题。

标签: cmake generator-expression


【解决方案1】:

似乎可行的类似但不完全相同的逻辑是:

target_link_library(foo PUBLIC
  $<TARGET_NAME_IF_EXISTS:bar>
  $<TARGET_NAME_IF_EXISTS:baz>
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多