由于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() 用来声明程序中的宏