避免在CMake中出现许多"../include"

Avoiding many "../include" in CMake

本文关键字:许多 include CMake      更新时间:2023-10-16

我刚开始和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_LIBRARYADD_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。当然,您可以更改和添加路径,示例中的路径是我在项目中使用的路径。