gpt4 book ai didi

c++ - CMake:包含 vs add_subdirectory:相对头文件路径

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:50:19 32 4
gpt4 key购买 nike

我有一个包含多个子目录的 C++ 项目,例如

src/
CMakeLists.txt
main.cpp
module1/
CMakeLists.txt
code.cpp
code.h
module2/
CMakeLists.txt
code2.cpp

似乎在 cmake 中处理这个问题的两种方法是在我的 src/CMakeLists 中使用 add_subdirectory(module1)include(module1) .txt。我在某处读到,include 使用被视为遗留/弃用。我的 src/module1/CMakeLists.txt 看起来像这样:

include_directories(${CMAKE_CURRENT_LIST_DIR})

set( SRCS
${SRCS}
${CMAKE_CURRENT_LIST_DIR}/code.cpp
)

set( QT_FILE_HEADERS
${QT_FILE_HEADERS} code.h
)

如果我尝试使用 add_subdirectory 方法并想在 main.cpp 中使用 code.h 我必须编写 #include "module1/code.h"。如果我做添加module1的include方法,我可以简单的写#include "code.h"。当我在其他地方使用它们时,我不想指定包含文件的相对路径,有没有办法使用 add_subdirectory 方法来实现这一点?我认为 include_directories 行应该已经解决了这个问题。

最佳答案

这不是您制作模块的方式——当然您可以这样做,它有效,但不是很有用。给定您的布局,只需在主 CMakeLists.txt 文件中引用 module1/code.cpp

但是,如果你想使用模块,让每个模块成为一个单独的静态库。这将真正简化事情!

src/CMakeLists.txt中写入:

add_subdirectory(module1)

add_executable(myprogram main.cpp)
target_link_libraries(myprogram module1)

src/module1/CMakeLists.txt中写入:

add_library(module1 STATIC code.cpp)
target_include_directories(module1 PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

这样,您只从 module1 CMake 脚本传回一个东西:module1 目标。您的 main 不需要知道里面发生了什么。如果 module1 中的代码需要特定的外部库,将它们链接到那里,主 CMake 脚本将不需要知道它。只需链接到 module1,所有的魔法都会在幕后发生,您的程序将使用正确的包含目录进行编译并链接到正确的库。

关于c++ - CMake:包含 vs add_subdirectory:相对头文件路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49984011/

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