我有一个小的静态库,需要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/