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

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值