我刚开始使用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(...)只需要整个树中每个目录一个。
答案 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_LIBRARY
或ADD_EXECUTABLE
添加标头。只需要源文件“cpp,c,cxx,...”,因为通过include宏#include
,您可以告诉编译器它在哪里找到头文件。
使用INCLUDE_DIRECTORIES(...)
,您只需向编译器添加搜索路径以查找标头。如果您的标题与源位于同一目录中,则不需要其他搜索路径。此外,包含宏的子路径也可以使用此#include "../../include"
。所以它实际上取决于源文件的结构。还要记住,编译器设置设置知道某些系统头文件的位置。这就是为什么你也不需要定义它们。
最后但并非最不重要的是有cmake脚本和pkg搜索文件,其中自动完成向特定库添加路径。