【问题标题】:Cmake: target_link_libraries propagation of include directoriesCmake:包含目录的target_link_libraries传播
【发布时间】:2017-11-08 09:15:08
【问题描述】:

我有一个小型静态库,它需要 boost 标头,并且需要包含目录中的“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 调用的包含目录,导致系统头文件被拾取而不是我的 alib 版本头文件。

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

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

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

【问题讨论】:

    标签: cmake


    【解决方案1】:

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

    例如,如果一个目标的链接库必须以lib1lib2lib3的顺序指定,但包含目录必须以lib3lib1lib2的顺序指定:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 2015-07-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多