不同的环境有不同的工程构建方法,例如qt用qmake语法,gnu用make语法,微软有nmake等等,对于不同的Make工具,我们需要编写用不同的语法进行编写。而cmake就是对语法进行抽象统一。cmake 的使用为:编写CMakeLists.txt
文件 → 执行 cmake,生成对应的Make文件 → 执行make;
函数篇
编译参数设置
add_definitions(-std=c++14)
的作用:设置c++编译器的语言版本号,有的语法是在c++14中新加的,则如果用之前的版本就会出现编译错误;include_directories(directory1 directory2 ...)
:设置头文件所在的目录;link_directories(directory1 directory2 ...)
:设置库文件夹;
目标生成
add_executable(目标名 文件1 文件2 ...)
将文件1、文件2、... 一起编译成一个可执行文件;add_library(目标名 文件1 文件2 ...)
将 文件1、文件2、... 进行静态编译,并合并为一个lib目标名.a
的静态文件库;如果是add_library(目标名 SHARED 文件1 文件2 ...)
将会生成动态链接库;add_subdirectory(<dir>)
的作用:加入到指定的dir中,并执行cmake .
命令,如果dir中不含有CMakeLists.txt
文件,会发生执行错误;target_link_libraries(<target> ... <item> ...)
:设置target
的动态链接库;
cmake变量设置
set(<variable> <value>)
:设置variable
的值为value
,value
也可以使用变量;另外,变量也可以在执行 cmake 时设置,例如:cmake -DCMAKE_X=abc .
等价于在CMakeLists.txt
中添加了语句set(CMAKE_X abc)
;file(GLOB_RECURSE source_files a/*.cpp b/*.h)
:递归查找 a 下的cpp文件和b下的h文件,将找到的文件存在变量source_files下;aux_source_directory(<dir> <variable>)
将 dir 目录下的所有源文件都保存在变量variable
中,以空格分隔;
cmake 辅助功能
-
message(<mode> <information>)
:mode
表示message的类型,有:STATUS
/WARNING
/AUTHOR_WARNING
/SEND_ERROR
/FATAL_ERROR
/DEPRECATION
,该打印操作是在执行cmake时执行,而不是执行make时执行;
变量篇
MAKE
变量:在makefile中,变量 $(MAKE) 是当前环境中make路径,可能是make、qmake、pmake、nmake。CMAKE_SOURCE_DIR
:该变量表示第一个执行cmake的CMakeLists.txt
所在的文件夹,而不是通过add_subdirectory
中的文件夹地址;CMAKE_BINARY_DIR
:该变量表示执行cmake时所在的文件夹,通常来说,如果执行cmake .
,则CMAKE_SOURCE_DIR
和CMAKE_BINARY_DIR
相同;例如我们的 CMakeLists.txt 文件在 a 文件夹下,我们在 a/b 文件夹下执行cmake ..
,那么CMAKE_SOURCE_DIR
就是 a,而CMAKE_BINARY_DIR
就是 a/b;CMAKE_BUILD_TYPE
变量可改变编译组态,预设的 CMAKE_BUILD_TYPE 是None,支持:Debug、Release、RelWithDebInfo、MinSizeRel;CMAKE_ARCHIVE_OUTPUT_DIRECTORY
/CMAKE_LIBRARY_OUTPUT_DIRECTORY
/LIBRARY_OUTPUT_PATH
/CMAKE_RUNTIME_OUTPUT_DIRECTORY
:见文章 https://www.jianshu.com/p/599550afd28d;
make 选项
-
--print-directory
:等价于-w
,在makefile中执行cd操作时,会显示进入目录和离开目录的信息;