避免在CMake中出现许多"../include"
Avoiding many "../include" in CMake
我刚开始和C++一起进入CMake,想知道其他程序员如何避免不得不做"../包括"在他们所有的CMakeFiles.txt
.
这里有一个例子:https://github.com/clab/cnn/blob/master/examples/CMakeLists.txt
他们为每个示例创建一个可执行文件,而无需调用 INCLUDE_DIRECTORIES(...)
。
我尝试在调用ADD_LIBRARY(...)
时添加标头,但这似乎不起作用。
例:
tl/src/CMakeLists.txt:
SET(SRCS "x1.cpp" "x2.cpp")
SET(HDRS "../include/tl/x1.h" "../include/tl/x2.h")
INCLUDE_DIRECTORIES("../include")
ADD_LIBRARY(test_lib ${SRCS} ${HDRS})
tl/CMakeLists.txt:
PROJECT(TEST_LIB VERSION 0.1)
ADD_SUBDIRECTORY("src")
tl/examples/CMakeLists.txt:
INCLUDE_DIRECTORIES("../include")
ADD_EXECUTABLE(e1 e1.cpp)
TARGET_LINK_LIBRARIES(e1 test_lib)
编辑:我相信INCLUDE_DIRECTORIES(...)在整个树中的每个目录只需要一个。
只需在顶层添加 INCLUDE_DIRECTORIES
命令即可。无需显式添加包含的文件。
tl/CMakeLists.txt:
PROJECT(TEST_LIB VERSION 0.1)
INCLUDE_DIRECTORIES("include")
ADD_SUBDIRECTORY("src")
ADD_SUBDIRECTORY("examples")
tl/src/CMakeLists.txt:
ADD_LIBRARY(test_lib "x1.cpp" "x2.cpp")
tl/examples/CMakeLists.txt:
ADD_EXECUTABLE(e1 e1.cpp)
TARGET_LINK_LIBRARIES(e1 test_lib)
这个怎么样?tl/CMakeLists.txt
SET(SRCS "x1.cpp" "x2.cpp")
SET(HDRS "../include/tl/x1.h" "../include/tl/x2.h")
INCLUDE_DIRECTORIES("${CMAKE_PROJECT_DIR}/include")
ADD_LIBRARY(test_lib ${SRCS} ${HDRS})
如果要编译程序和库,则无需向ADD_LIBRARY
或ADD_EXECUTABLE
添加标头。仅源文件"cpp,c,cxx,..."是必需的,因为通过包含宏#include
告诉编译器在哪里可以找到头文件。
使用 INCLUDE_DIRECTORIES(...)
您只需向编译器添加搜索路径以查找标头。如果您的标头与源位于同一目录中,则不需要其他搜索路径。此外,像这样包含宏的子路径也是可能的#include "../../include"
。因此,这实际上取决于源文件的结构。还要记住,编译器设置设置知道某些系统标头的位置。这就是为什么您也不需要定义它们的原因。
最后但并非最不重要的一点是,还有 cmake 脚本和 pkg 搜索文件,其中会自动添加特定库的路径。
这是我在我的一个项目中的做法:
file(GLOB_RECURSE SRC
engine/*.cpp
platfoorm/*.cpp
)
file(GLOB_RECURSE INCLUDES
engine/*.h
platform/*.h
)
这将生成一个内部"硬编码"文件列表,生成的 makefil 将使用该文件,因此,如果您添加新的源文件,则需要重新运行 cmake。当然,您可以更改和添加路径,示例中的路径是我在项目中使用的路径。
- 既然存在危险,为什么项目要使用-I include开关
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何将更多文件夹添加到c++include路径
- 什么是"#include <boost/functional/hash.hpp> "?
- 在混合代码库中将C转换为C++时出现许多包含错误
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- 函数在许多数字上转换为基数 1 时减去 2?
- C++包含来自 #include "DevEngine/Core.h" 的错误
- <filesystem> 在 clang 6 和 10 上 #include 错误
- 在 void 函数中使用 #include 变量C++
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 我想生成许多矩阵并用随机数填充它
- Visual Studio 2017 停止工作,并在打开后显示许多控制台窗口
- N-API include an .so or dll
- 允许哪些令牌作为 #include 的参数?
- 使用许多嵌套的#include语句对编译器错误进行故障排除
- 为什么必须在 Linux 系统上"installed" uuid.h 才能构建许多C++程序,而不仅仅是放入 include 或 lib 文件夹
- 添加许多 -isystem include 指令是否会显著减慢编译过程
- 避免在CMake中出现许多"../include"
- #include < windows.h> 在全局命名空间中定义了许多符号,例如 Polygon