Cmake:target_link_libraries 包含目录的传递

18

我有一个小的静态库,它需要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 的目录,而不是之后再包含?

1个回答

7
不,你的“hack”或多或少是文档中推荐的方式

For example, if the linked libraries for a target must be specified in the order lib1 lib2 lib3, but the include directories must be specified in the order lib3 lib1 lib2:

target_link_libraries(myExe lib1 lib2 lib3)
target_include_directories(myExe
  PRIVATE $<TARGET_PROPERTY:lib3,INTERFACE_INCLUDE_DIRECTORIES>)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接