CMake:包含目录的target_link_libraries传播

Lex*_*Lex 7 cmake

我有一个小的静态库,它需要boost标头,并且需要include目录中的“ include”目录。

...
add_library(alib STATIC ...)
target_include_directories(alib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_include_directories(alib PRIVATE ${Boost_INCLUDE_DIRS})
...
Run Code Online (Sandbox Code Playgroud)

我在alib的系统上有另一个安装,正是$ {Boost_INCLUDE_DIRS}指向的位置,但这是系统的其他软件包所需的较旧版本。关键是我想构建自定义版本的alib作为项目的目标。因此,非常重要的一点是,系统alib中的任何内容都不会包含或链接到该文件。

现在,我有另一个库mylib依赖于alib,因此我执行以下操作:

...
add_library(mylib STATIC ...)
target_link_libraries(mylib PUBLIC alib)
target_include_directories(mylib PRIVATE ${EXPAT_INCLUDE_DIRS})
...
Run Code Online (Sandbox Code Playgroud)

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>)
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法呢?我怎么能强迫的CMake包含的目录alib 右远target_link_directories电话,而不是之后?

Flo*_*ian 7

不,您的“黑客”或多或少是文档中推荐的方式

例如,如果目标的链接库必须按顺序指定lib1 lib2 lib3,但包含目录必须按顺序指定lib3 lib1 lib2

target_link_libraries(myExe lib1 lib2 lib3)
target_include_directories(myExe
  PRIVATE $<TARGET_PROPERTY:lib3,INTERFACE_INCLUDE_DIRECTORIES>)
Run Code Online (Sandbox Code Playgroud)