cmake简洁教程 - 第五篇

由于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简洁教程 - 第五篇_第1张图片

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

cmake简洁教程 - 第五篇_第2张图片

 第二小节:使用 option() 命令设置编译变量

我们可以在CMakeLists.txt文件中通过设置变量的值,再像程序一样,通过if else的逻辑判断执行不同的操作

举例如下:新建两个main文件,分别是main1.cpp,main2.cpp,在指定情况下编译main1.cpp 和main2.cpp,其他情况下只编译main1.cpp

文件架构如下图(main1.cpp,main2.cpp都在src目录下,另外有两个CMakeLists.txt文件)

cmake简洁教程 - 第五篇_第3张图片

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

 cmake简洁教程 - 第五篇_第4张图片 cmake简洁教程 - 第五篇_第5张图片

根目录下的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

cmake简洁教程 - 第五篇_第6张图片

 如果我们修改根目录下的CMakeLists.txt文件,MYDEBUG的值改为ON,如下

option (MYDEBUG "debug mode" ON)

再次cd到build目录下,依次执行命令 cmake .. make,可以看到编译了目标main1, main2

cmake简洁教程 - 第五篇_第7张图片

 如果每次编译需要修改CMakeLists.txt文件,略显麻烦

我们可以直接通过cmake命令来设置变量 MYDEBUG 的值,方式如下

cmake .. -DMYDEBUG=ON

结果如下图

cmake简洁教程 - 第五篇_第8张图片

 

第三小节:使用 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"

cmake简洁教程 - 第五篇_第9张图片

 

本篇总结(2个新命令)

1. 命令 add_compile_options()  用来设置编译选项,如c++11,  -Wall,  -w  等等

2. 命令 option() 用来设置cmake中的变量,可以控制编译逻辑

3. 命令 add_definitions() 用来声明程序中的宏

你可能感兴趣的:(makefile和cmake,cmake详解,cmake用法,cmake,cmake教程)