我有一个小的静态库,需要boost header ,并且需要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所在的include路径。

Cmake是否可以按照提供顺序正确地包括include目录,即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 即时的目录?

最佳答案

不,您的“hack”或多或少是the recommended way in the documentation:

关于CMake:包含目录的target_link_libraries传播,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47175683/

10-13 05:58