如何正确使用CMake添加包含目录
如何正确添加CMake的包含目录
在使用CMake时,如果想要正确地添加包含目录,需要进行两个步骤。
首先,需要将目录添加到包含目录中。可以使用
target_include_directories(test PRIVATE ${YOUR_DIRECTORY})
来实现。如果你使用的是较旧的CMake版本(2.8.10或更旧),不支持target_include_directories
,则可以使用传统的include_directories
代替,例如
include_directories(${YOUR_DIRECTORY})
。
接下来,还需要将头文件添加到当前目标的源文件列表中。例如:
set(SOURCES file.cpp file2.cpp ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h) add_executable(test ${SOURCES})
。这样,头文件将出现在Makefile中的依赖项中,也会出现在生成的Visual Studio项目中(如果你生成了一个)。
如何在多个目标中使用这些头文件:
set(HEADER_FILES ${YOUR_DIRECTORY}/file1.h ${YOUR_DIRECTORY}/file2.h) add_library(mylib libsrc.cpp ${HEADER_FILES}) target_include_directories(mylib PRIVATE ${YOUR_DIRECTORY}) add_executable(myexec execfile.cpp ${HEADER_FILES}) target_include_directories(myexec PRIVATE ${YOUR_DIRECTORY})
如果你有多个CMakeLists.txt文件,可以在libroot子目录中使用PARENT_SCOPE选项设置变量,这将使变量在父级CMakeLists.txt文件中可用,从而可以在其他子目录中使用。
通过以上步骤,可以正确地添加CMake的包含目录。首先使用target_include_directories
或include_directories
将目录添加到包含目录中,然后将头文件添加到当前目标的源文件列表中。通过这种方式,可以确保头文件作为依赖项出现在Makefile中,并且在生成的Visual Studio项目中(如果有)中也会出现。此外,也可以使用CMake变量在多个地方共享头文件列表。
需要注意的是,应该始终使用target_include_directories
而不是include_directories
,因为前者会为目标设置包含目录,而后者会递归地为目录中的所有目标设置包含目录。同时,应该注意将头文件添加到add_library
和add_executable
中,而不是include_directories
中。
希望以上内容对你有所帮助!
CMake是一个跨平台的构建工具,用于自动化构建、测试和打包C++代码。在使用CMake构建项目时,有时需要将头文件所在的目录添加到编译器的搜索路径中。本文将讨论如何使用CMake正确地添加包含目录,并解答了一些相关的问题。
在CMake中,可以使用`include_directories()`来告诉CMake将目录添加为编译命令行的`-I`选项。然后,可以在`add_executable()`或`add_library()`函数的调用中列出头文件。
例如,如果项目的源代码位于`src`目录下,需要使用`include`目录中的头文件,可以按照以下方式进行设置:
include_directories(include) add_executable(MyExec src/main.c src/other_source.c include/header1.h include/header2.h )
需要注意的是,在`add_executable()`中列出头文件并非必需,因为CMake可以自动识别头文件的依赖关系。但是,如果列出头文件,则它们会被视为项目的一部分,并在集成开发环境(IDE)中显示。
在QtCreator中,如果存在`class.cpp`文件,则不需要添加`class.h`文件。只有单独的头文件需要添加到源文件中。
问为什么在源文件列表中需要在头文件前加上`include/`前缀,而已经将`include`目录添加为包含目录之一。
其实,在`add_executable()`中的CMakeLists文件中指定的路径是相对于当前源代码目录的,而不是相对于编译器的。因此,需要在源文件列表中指定完整的路径。
有人问道,`include_directories()`是为编译器而存在的,CMake是否会忽略它?只要头文件所在的父目录已经添加到`include_directories()`中,是否还需要在`add_executable()`中列出头文件呢?
可以在上面的评论中找到答案。
,使用CMake时,通过`include_directories()`函数将头文件所在的目录添加到编译器的搜索路径中。然后,在`add_executable()`或`add_library()`函数的调用中,列出需要使用的源文件和头文件。这样,CMake就能正确地处理头文件的依赖关系,并在IDE中显示它们。