【发布时间】:2023-03-04 11:55:02
【问题描述】:
我有一个包含多个子目录的 c++ 项目,例如
src/
CMakeLists.txt
main.cpp
module1/
CMakeLists.txt
code.cpp
code.h
module2/
CMakeLists.txt
code2.cpp
似乎在cmake中处理这个问题的两种方法是在我的src/CMakeLists.txt中使用add_subdirectory(module1)或include(module1)。我在某处读到,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"。如果我做include添加module1的方法,我可以简单地写#include "code.h"。当我在其他地方使用包含文件时,我不想指定它们的相对路径,有没有办法使用add_subdirectory 方法来实现这一点?我认为include_directories 行应该已经解决了这个问题。
【问题讨论】:
-
CMake 的
include绝对不会被弃用或遗留 -
通常认为将头文件放入子目录以避免名称冲突并在安装后具有更好的结构
/usr/include是一种很好的做法。它还消除了为您的代码用户指定-Imodule1的要求。 -
如果我没记错的话,这意味着使用 include 添加包含自己的 CMakeList 文件的子目录
-
我不明白为什么这被标记为重复。另一篇文章与
include关键字无关。简而言之,add_subdirectory引入了一个新的作用域,而include没有。您将在这篇文章中找到更多解释:crascit.com/2016/01/31/enhanced-source-file-handling-with-target_sources。我认为一般来说最好使用add_subdirectory,除非你出于某种原因需要使用include。例如,在定义新目标或在子目录中启用新语言时,有时会发生这种情况。 -
@numberCruncher 您的代码是否使用
add_subdirectory编译?在您的set(SRC...声明中没有PARENT_SCOPE,因此似乎实际上并未包含该源文件。