gpt4 book ai didi

Cmake:包含目录的 target_link_libraries 传播

转载 作者:行者123 更新时间:2023-12-04 08:47:29 35 4
gpt4 key购买 nike

我有一个小型静态库,它需要 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 不遵守此顺序,并在命令行末尾附加了 target_link_libraries 调用中的包含目录,从而导致系统 header 被拾取而不是我的 alib 版本 header 。

我无法以任何方式更改 alib 目录的名称。
我当前的解决方案是通过手动引用 alib 目标来破解对 target_include_directories 的自定义调用:
target_include_directories(mylib PUBLIC $<TARGET_PROPERTY:alib,INCLUDE_DIRECTORIES>)

有没有更好的方法呢?如何强制 Cmake 包含 alib 目录 马上target_link_directories打电话,而不是之后?

最佳答案

不,你的“黑客”或多或少the recommended way in the documentation :

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>)

关于Cmake:包含目录的 target_link_libraries 传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47175683/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com