【问题标题】:CMake Include dependencies of imported library without linkingCMake包含导入库的依赖项而不链接
【发布时间】:2016-07-23 05:38:22
【问题描述】:

我正在使用 CMake 3.5.2。

考虑以下情况。我有一个导入库Foo::Foo

add_library(Foo::Foo UNKNOWN IMPORTED)

这个导入的库已经填充了适当的属性:

set_target_properties(Foo::Foo PROPERTIES
  INTERFACE_INCLUDE_DIRECTORIES "/path/to/include/blah" "/another/path/include/other"
  IMPORTED_LINK_INTERFACE_LIBRARIES blah other
  IMPORTED_LOCATION "/path/to/libfoo.a-or-so")

我有一个名为bar 的便利库。我需要它来包含Foo::Foo 的包含目录,但我不希望它链接到Foo::Foo

add_library(bar STATIC "${BAR_SOURCES}")

如何仅添加来自Foo::Foo 的包含依赖项?这是我尝试过的失败:

# This did not include any includes from Foo::Foo
target_link_libraries(bar INTERFACE Foo::Foo)

# This included only the first include directory from Foo::Foo
target_include_directories(bar PUBLIC "$<TARGET_PROPERTY:Foo::Foo,INTERFACE_INCLUDE_DIRECTORIES>")

【问题讨论】:

  • 你想从上次通话中删除引号吗?
  • @Florian 不,但我只是这样做了,没有任何区别。

标签: cmake


【解决方案1】:

我已经给你一个例子了。您应该将示例中的代码更改为:

set_target_properties(
   Foo::Foo PROPERTIES
       INTERFACE_INCLUDE_DIRECTORIES 
           "/path/to/include/blah;/path/to/include/other"
       IMPORTED_LINK_INTERFACE_LIBRARIES "blah.a"
       IMPORTED_LOCATION "/path/to/libfoo.a-or-so"
 )

set_target_properties() 的调用仅接受“属性”/“值”对(以空格作为分隔符)。而且您的示例没有引发任何错误,因为您始终可以定义自己的属性(使用任何命名)。

请将您的包含目录列表转换为“CMake 列表”(以分号分隔的字符串)。

替代方案

如果您只想“重置”传递库,您可以使用例如:

target_link_libraries(bar Foo::Foo)
set_target_properties(bar PROPERTIES INTERFACE_LINK_LIBRARIES "")

我在同一个项目中构建共享库时使用了这种方法,因为我正在链接相同的项目(并且我不希望共享库的库依赖项也使用共享库链接到目标)。

参考文献

【讨论】:

  • 谢谢。这确实是问题所在。我确实想知道使用$&lt;TARGET_PROPERTY:...&gt; 的解决方案是否正确,但这目前有效。
  • @md5i 不客气。很抱歉,我忘记回答您关于调试示例代码的原始问题。我已经相应地更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 2012-12-21
  • 2023-03-30
  • 2014-04-04
  • 2016-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多