如何正确添加包含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那么酷,但仍然。
如果在各种开源项目中查看人们如何包含目录,就没有“ 正确的方式 ”这样的事情。 但有两种方法可以做到这一点。
-
原油include_directories它将追加目录到当前项目和所有其他后代项目,你将通过一系列的add_subdirectory命令追加。 有时候人们会说这种方式是遗留下来的。
-
更优雅的方式target_include_directories 。 它允许追加目录特定的项目/目标没有(也许)unnessesaryinheritance或冲突的各种inlude目录。 还允许执行甚至是子configuration,并为此命令添加以下标记之一
PRIVATE – 仅用于此指定的构build目标
PUBLIC – 将其用于指定的目标以及与此项目链接的目标
界面 – 仅用于与当前项目链接的目标
PS
-
这两个命令都允许将目录标记为SYSTEM,以提示如果指定目录不是您的业务,则会发出警告。
-
类似的答案是与其他对的命令target_compile_definitions / add_definitions , target_compile_options / CMAKE_C_FLAGS