Cmake:包含目录的target_link_libraries传播

时间:2017-11-08 09:15:09

标签: cmake

我有一个小型静态库,需要增强标头,并且需要" include" include目录中的目录。

...
add_library(alib STATIC ...)
target_include_directories(alib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_include_directories(alib PRIVATE ${Boost_INCLUDE_DIRS})
...

我在 alib 系统上有另一个安装,正好是$ {Boost_INCLUDE_DIRS}指向的地方,但这是我的系统的其他软件包所需的旧版本。 关键是我想构建一个自定义版本的 alib 作为我项目的目标。因此,系统 alib 中没有任何内容被包含或链接,这一点非常重要。

现在我有另一个依赖于 alib 的库 mylib ,所以我执行以下操作:

...
add_library(mylib STATIC ...)
target_link_libraries(mylib PUBLIC alib)
target_include_directories(mylib PRIVATE ${EXPAT_INCLUDE_DIRS})
...

target_link_libraries(mylib PUBLIC alib)调用正确地添加来自 alib 的包含,但它包含在第二行target_include_directories(mylib PRIVATE ${EXPAT_INCLUDE_DIRS})指定的包含之后,即使它们是在之后指定的。

问题是${EXPAT_INCLUDE_DIRS}指向系统 alib 所在的包含路径。

如果Cmake按照提供的顺序正确附加包含目录,也就是target_link_libraries(mylib PUBLIC alib)然后target_include_directories(mylib PRIVATE ${EXPAT_INCLUDE_DIRS})的那些目录,则无关紧要。

但是cmake不遵守此顺序,并在命令行末尾的target_link_libraries调用中附加include目录,从而导致系统标头被拾取而不是我的 alib 版本标头。

我无法以任何方式更改 alib 的目录名称。 我目前的解决方案是通过手动引用 alib 目标来破解对target_include_directories的自定义调用:

target_include_directories(mylib PUBLIC $<TARGET_PROPERTY:alib,INCLUDE_DIRECTORIES>)

有更好的方法吗?如何强制Cmake在target_link_directories调用中包含 alib 右侧的目录,而不是之后?

1 个答案:

答案 0 :(得分:1)

不,你的“黑客”或多或少the recommended way in the documentation

  

例如,如果必须按照lib1 lib2 lib3的顺序指定目标的链接库,但必须按照lib3的顺序指定包含目录lib1 lib2

target_link_libraries(myExe lib1 lib2 lib3)
target_include_directories(myExe
  PRIVATE $<TARGET_PROPERTY:lib3,INTERFACE_INCLUDE_DIRECTORIES>)