我有一个小的静态库,它需要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并不遵循这个顺序,而是将目标链接库的包含目录附加到命令行的末尾,导致选择了系统头文件而不是我的版本的alib头文件。
我无法以任何方式更改alib目录的名称。 我的当前解决方案是通过手动引用alib目标来对
target_include_directories
进行自定义调用。target_include_directories(mylib PUBLIC $<TARGET_PROPERTY:alib,INCLUDE_DIRECTORIES>)
有更好的方法吗?我如何强制Cmake立即在target_link_directories
中包含alib 的目录,而不是之后再包含?