gpt4 book ai didi

c++ - target_include_directories 结果包含路径

转载 作者:行者123 更新时间:2023-11-30 03:33:14 25 4
gpt4 key购买 nike

假设我有一个看起来像这样的项目:

 Project (dir)
-- CMakeLists.txt
-- MyLib (dir)
|-- CMakeLists.txt
|-- MyLib.h
|-- MyLib.cpp

-- MyOtherLib (dir)
|-- CMakeLists.txt
|-- MyLib.h (note that this is exactly the same name as in MyLib above)
|-- MyLib.cpp

如果在 MyLib/CMakeLists.txt 中,我这样做:

target_include_directories(MyLib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>

然后 target_link_librariesMyLib 的任何内容都将具有执行 #include "MyLib.h" 的“正确”包含路径。但是,如果另一个可执行文件 MyExecutable 依赖于两个使用 target_link_libraries(MyExecutable MyLib MyOtherLib) 的库,您希望能够指定哪个库用于 #包括 "MyLib/MyLib.h"#include "MyOtherLib/MyLib.h"。我看到这样做的唯一方法是改用:

target_include_directories(MyLib PUBLIC
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>

这破坏了 target_include_directories 的优点之一,因为它确实强烈强制避免意外的 header 依赖项,因为您实际上不能包含您未明确声明使用的内容。

是否有另一种方法可以实现此#include "MyLib/MyLib.h" 行为?

最佳答案

您应该重新考虑您的目录树,如下所示:

Project (dir)
-- CMakeLists.txt
-- MyLib (dir)
|-- CMakeLists.txt
|-- src (dir)
MyLib.cpp
|-- include/MyLib (two dirs)
MyLib.h

-- MyOtherLib (dir)
|-- CMakeLists.txt
|-- src (dir)
MyLib.cpp
|-- include/MyOtherLib (two dirs)
MyLib.h

通过这种方式,您可以避免包含 ../,即 Project、文件夹和其中的所有内容,这不是一种干净的方法,如果您这样做可能会导致其他问题将来添加其他文件/文件夹。然后,你可以在MyLib/CMakeLists.txt

中写入
target_include_directories(MyLib PUBLIC 
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/include)

并在 MyOtherLib/CMakeLists.txt

target_include_directories(MyOtherLib PUBLIC 
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>/include)

因此,您将能够在任何程序链接中编写 #include "MyLib/MyLib.h"#include "MyOtherLib/MyLib.h"针对 build-tree 中的库。

如果您还想区分 build-treeinstall-tree 之间的包含目录,请查看 target_include_directories documentation和有用的 cmake-generator-expressions .

关于c++ - target_include_directories 结果包含路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43127301/

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