如何正确添加包含CMake的目录?

大约一年前,我问了CMake中的头文件依赖关系 。

我最近意识到这个问题似乎是CMake认为这些头文件是项目外部的。 至less,在生成Code :: Blocks项目时,头文件不会出现在项目中(源文件)。 因此,在我看来,CMake认为这些头文件是项目外部的,并不依赖于它们。

在CMake教程快速search只指向include_directories这似乎并没有做我想要的…

什么是正确的方式来通知CMake一个特定的目录包含头文件,并且这些头文件应该由生成的Makefile进行跟踪?

有两件事情必须做。

首先添加要包含的目录:

 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}) add_executable(myexec execfile.cpp ${HEADER_FILES}) 

首先,使用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 ) 

CMake更像是一种脚本语言,如果与其他方式来创buildMakefile(如make或qmake)相比。 它不像Python那么酷,但仍然。

如果在各种开源项目中查看人们如何包含目录,就没有“ 正确的方式 ”这样的事情。 但有两种方法可以做到这一点。

  1. 原油include_directories它将追加目录到当前项目和所有其他后代项目,你将通过一系列的add_subdirectory命令追加。 有时候人们会说这种方式是遗留下来的。

  2. 更优雅的方式target_include_directories 。 它允许追加目录特定的项目/目标没有(也许)unnessesaryinheritance或冲突的各种inlude目录。 还允许执行甚至是子configuration,并为此命令添加以下标记之一

PRIVATE – 仅用于此指定的构build目标

PUBLIC – 将其用于指定的目标以及与此项目链接的目标

界面 – 仅用于与当前项目链接的目标

PS

  1. 这两个命令都允许将目录标记为SYSTEM,以提示如果指定目录不是您的业务,则会发出警告。

  2. 类似的答案是与其他对的命令target_compile_definitions / add_definitions , target_compile_options / CMAKE_C_FLAGS