在CMake中避免许多“../include”

时间:2016-01-19 16:47:01

标签: c++ cmake

我刚开始使用C ++进入CMake,并想知道其他程序员如何避免在所有CMakeFiles.txt中执行“../include”。

这里有一个例子: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 /示例/的CMakeLists.txt:

INCLUDE_DIRECTORIES("../include")
ADD_EXECUTABLE(e1 e1.cpp)
TARGET_LINK_LIBRARIES(e1 test_lib)

编辑:我认为INCLUDE_DIRECTORIES(...)只需要整个树中每个目录一个。

3 个答案:

答案 0 :(得分:1)

只需在顶层添加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 /示例/的CMakeLists.txt:

ADD_EXECUTABLE(e1 e1.cpp)
TARGET_LINK_LIBRARIES(e1 test_lib)

答案 1 :(得分:0)

这就是我在我的一个项目中做到的:

file(GLOB_RECURSE SRC
    engine/*.cpp
    platfoorm/*.cpp
    )

file(GLOB_RECURSE INCLUDES 
    engine/*.h
    platform/*.h
    )

这将生成生成的makefil将使用的内部“硬编码”文件列表,因此如果添加新的源文件,则需要重新运行cmake。 当然,您可以更改和添加路径,示例中的路径是我在项目中使用的路径。

答案 2 :(得分:0)

这个怎么样? 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,您可以告诉编译器它在哪里找到头文件。

使用INCLUDE_DIRECTORIES(...),您只需向编译器添加搜索路径以查找标头。如果您的标题与源位于同一目录中,则不需要其他搜索路径。此外,包含宏的子路径也可以使用此#include "../../include"。所以它实际上取决于源文件的结构。还要记住,编译器设置设置知道某些系统头文件的位置。这就是为什么你也不需要定义它们。

最后但并非最不重要的是有cmake脚本和pkg搜索文件,其中自动完成向特定库添加路径。