由于cmake内容较多,篇幅较长,为了不让人疲倦,分成了多篇博客,全部博客链接如下
cmake简洁教程 - 第一篇_YZF_Kevin的博客-CSDN博客_cmake入门教程
cmake简洁教程 - 第二篇_YZF_Kevin的博客-CSDN博客
cmake简洁教程 - 第三篇_YZF_Kevin的博客-CSDN博客
cmake简洁教程 - 第四篇_YZF_Kevin的博客-CSDN博客
前面几篇我们讲解了如何编译,使用可执行文件,动态库,静态库,从本篇博客开始讲一些辅助功能
第一小节:使用 add_compile_options() 命令指定编译选项
如果编译程序时,我们想添加一些编译选项,比如设置警告级别,设置c++标准等,就可以使用命令 add_compile_options 来进行设置
举个例子,新建一个main.cpp文件,代码如下(代码中使用了auto也就是c++11的新特性)
- #include
- int main(void)
- {
- auto data = 100;
- std::cout << "data: " << data << "\n";
- return 0;
- }
在同目录下,新建一个CMakeLists.txt文件,内容如下
- cmake_minimum_required (VERSION 3.5)
- project (demo)
- add_compile_options(-std=c++11 -Wall)
- add_executable(main main.cpp)
主要解释下第5行:新命令 add_compile_options 设置编译选项。-std=c++11 用来指定编译标准是c++11,没有这句,编译会报错,auto无法识别。-Wall 用来指定需输出警告信息
整个目录下只有两个文件,如下图

接下来我们依次执行命令 cmake . make ./main 可以看到成功执行了,如下图

第二小节:使用 option() 命令设置编译变量
我们可以在CMakeLists.txt文件中通过设置变量的值,再像程序一样,通过if else的逻辑判断执行不同的操作
举例如下:新建两个main文件,分别是main1.cpp,main2.cpp,在指定情况下编译main1.cpp 和main2.cpp,其他情况下只编译main1.cpp
文件架构如下图(main1.cpp,main2.cpp都在src目录下,另外有两个CMakeLists.txt文件)

其中main1.cpp和main2.cpp文件内容如下(只有一句打印)

根目录下的CMakeLists.txt文件,内容如下
- cmake_minimum_required (VERSION 3.5)
- project (demo)
- add_compile_options(-std=c++11 -Wall)
- option (MYDEBUG "debug mode" OFF)
- set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
- add_subdirectory(src)
都是前面我们使用过的命令,只有第4,第5行需要解释下
option (MYDEBUG "debug mode" OFF) 的意思是设置编译变量,第一个参数表变量名为 MYDEBUG,第二个参数表注释,第三个参数表变量的值,如果没有第三个参数,该值默认为OFF
所以第4行的意思是设置了一个bool型的变量 MYDEBUG,值为OFF,也就是false
第5行的意思很简单了,就是指定本本目录下的src子目录还有子工程,且有CMakeLists.txt文件,请构建
其中src/CMakeLists.txt文件内容如下
- if (MYDEBUG)
- message(STATUS "now is in debug mode")
- add_executable(main1 main1.cpp)
- add_executable(main2 main2.cpp)
- else()
- message(STATUS "now is not in debug mode")
- add_executable(main1 main1.cpp)
- endif()
内容很简单,使用的像程序一样的 if else endif 结构,判断MYDEBUG的值来进行不同的编译
message() 命令用来打印输出一行文字
我们cd到根目录下的build目录,依次执行命令 cmake .. make ,可以看到编译了目标main1

如果我们修改根目录下的CMakeLists.txt文件,MYDEBUG的值改为ON,如下
option (MYDEBUG "debug mode" ON)
再次cd到build目录下,依次执行命令 cmake .. make,可以看到编译了目标main1, main2

如果每次编译需要修改CMakeLists.txt文件,略显麻烦
我们可以直接通过cmake命令来设置变量 MYDEBUG 的值,方式如下
cmake .. -DMYDEBUG=ON
结果如下图

第三小节:使用 add_definitions 来定义宏
option (MYDEBUG "debug mode" OFF) 可以设置cmake中的变量
add_definitions (xxx) 可以声明程序中的宏
举例,main.cpp代码如下(代码很简单,就是根据判断一个宏是否定义了打印不同的内容)
- #include
- int main(void)
- {
- #ifdef MYTEST
- std::cout << "MYTEST is true \n";
- #else
- std::cout << "MYTEST is false \n";
- #endif
- return 0;
- }
在同目录下建立文件CMakeLists.txt,内容如下
- cmake_minimum_required (VERSION 3.5)
- project (demo)
- add_definitions(-DMYTEST)
- add_executable(main main.cpp)
重点讲下第3行:新命令,格式 add_definitions(-Dxxxx) 意思是声明一个宏定义,名字为xxxx
我们依次执行命令 cmake . make ./main ,结果如我们所料,打印出了 "MYTEST is true"

本篇总结(2个新命令)
1. 命令 add_compile_options() 用来设置编译选项,如c++11, -Wall, -w 等等
2. 命令 option() 用来设置cmake中的变量,可以控制编译逻辑
3. 命令 add_definitions() 用来声明程序中的宏