如何正确使用CMake添加包含目录

8 浏览
0 Comments

如何正确使用CMake添加包含目录

大约一年前,我询问了关于CMake中头文件依赖的问题。最近我意识到问题似乎是CMake认为这些头文件是项目外部的。至少,在生成Code::Blocks项目时,头文件不会出现在项目中(源文件会出现)。因此,我认为CMake认为这些头文件是项目外部的,并且不在依赖关系中跟踪它们。在CMake教程中快速搜索只指出了include_directories,但它似乎不是我所希望的...有没有正确的方法告诉CMake一个特定的目录包含需要包含的头文件,并且这些头文件应该被生成的Makefile跟踪?

0
0 Comments

如何正确添加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_directoriesinclude_directories将目录添加到包含目录中,然后将头文件添加到当前目标的源文件列表中。通过这种方式,可以确保头文件作为依赖项出现在Makefile中,并且在生成的Visual Studio项目中(如果有)中也会出现。此外,也可以使用CMake变量在多个地方共享头文件列表。

需要注意的是,应该始终使用target_include_directories而不是include_directories,因为前者会为目标设置包含目录,而后者会递归地为目录中的所有目标设置包含目录。同时,应该注意将头文件添加到add_libraryadd_executable中,而不是include_directories中。

希望以上内容对你有所帮助!

0
0 Comments

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中显示它们。

0