我有一个小型静态库,需要增强标头,并且需要" 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 所在的包含路径。
如果Cmake按照提供的顺序正确附加包含目录,也就是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 右侧的目录,而不是之后?
答案 0 :(得分:1)
不,你的“黑客”或多或少the recommended way in the documentation:
例如,如果必须按照
lib1
lib2
lib3
的顺序指定目标的链接库,但必须按照lib3
的顺序指定包含目录lib1
lib2
:target_link_libraries(myExe lib1 lib2 lib3) target_include_directories(myExe PRIVATE $<TARGET_PROPERTY:lib3,INTERFACE_INCLUDE_DIRECTORIES>)