【发布时间】: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