由于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 MYTESTstd::cout << "MYTEST is true \n";#elsestd::cout << "MYTEST is false \n";#endifreturn 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() 用来声明程序中的宏

cmake简洁教程 - 第五篇相关推荐

  1. OpenCV学习系列教程第五篇:测试和提高代码的效率

    Opencv-Python学习系列教程第五篇 来自opencv-python官方学习文档,本人谨做翻译和注释,以及一些自己的理解 本文由作者翻译并进行代码验证,转载请注明出处~ 官方文档请参阅:htt ...

  2. 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)

    转:https://blog.csdn.net/forezp/article/details/69939114 最新版本: 史上最简单的SpringCloud教程 | 第五篇: 路由网关(zuul)( ...

  3. MVC教程第五篇:MVC整合Ajax

    MVC教程第五篇:MVC整合Ajax     摘要 本文将从完成"输入数据验证"这个功能出发,逐渐展开ASP.NET MVC与Ajax结合的方法.首先,本文将使用ASP.NET M ...

  4. 工具集核心教程 | 第五篇: 利用Velocity模板引擎生成模板代码

    前言 不知道大家有没有这样的感觉,在平时开发中,经常有很多dao.service类中存着很多重复的代码,Velocity提供了模板生成工具,今天我教大家怎么和这些大量的重复代码说再见. 参考项目:ht ...

  5. cmake使用教程(五)调用opencv外部库和自己生成的库

    这一节是我真正使用时遇到的,就是我需要构建动态库,但是这个动态库依赖外部的一些库如opencv.matlab等,那么若何构建这样的动态库呢?构建好如何测试呢?本篇将详细介绍其过程: 1.ubuntu安 ...

  6. 微信小程序教程 [第五篇]脚本语言(WXS)

    这是微信小程序近期引入的一个概念,我们可以在开发者工具中直接以独立文件的形式建立它们. 当然你也可以使用wxs标签直接在wxml文件中使用. 两种访问均可以. 使用场景:比如我们可以在视图里直接纳入简 ...

  7. CMake入门教程【手册篇】CMake生成与编译项目

    CMake构建项目与编译过程 文章目录 1.CMake构建与编译项目流程 2.CMake支持的所有平台 3.编译运行指令 windows minggw windows visual studio wi ...

  8. for循环里的if语句中break_Go语言极简教程 - 第五篇 控制语句

    if语句 语法 IfStmt = "if" [ SimpleStmt ";" ] Expression Block [ "else" ( I ...

  9. CMake入门教程【核心篇】7.1项目版本号宏

    文章目录 知识点 实例 代码目录 代码实现 知识点 configure_file configure_file 指令通过读取输入文件中的内容,将 CMakeLists.txt 文件中的变量转变为 C/ ...

最新文章

  1. 2018-3-31 ELM极限学习机--笔记(黄广斌PPT,以及极限学习机原理介绍的部分,但是忘记网址了)
  2. JavaScript有关的10个怪癖和秘密(转)
  3. Quartz集群部署
  4. linux 统计目录大小并按大小排序
  5. 总结对象的两个方法valueof和tostring
  6. 《Java数据结构和算法》Seven 高级排序 快速排序
  7. 手机电量剩一半就充比较好,还是快没电了再充比较好?为什么?
  8. android 停止服务执行,android - 为什么在停止服务(执行onDestroy已执行)后,服务中的变量没有“重置”?...
  9. 商务办公软件应用与实践【9】
  10. 2022保密教育线上培训考试参考答案 02
  11. srs+ffmpeg推流
  12. Java毕业设计-小区物业管理系统
  13. 阿里发布的Redis开发文档,涵盖了所有的redis操作
  14. QLineEdit屏蔽扫描枪输入自带回车的方法
  15. 哇!大开脑洞!“绿协杯”东莞市第六届绿色建筑设计比赛【往期获奖作品回顾上篇】
  16. Pdf转Word用Python轻松完成
  17. 进程线程----转自林海峰
  18. SIEBEL功能组件,eScript入门
  19. 逆水寒捏脸服务器维护,《逆水寒》优化热门服务器排队体验 捏脸颜值评分机制优化...
  20. 面试 以及面试中对公司更好的了解

热门文章

  1. ios不能保存png_AnyTrans for iOS for Mac (强大的ios设备管理工具)
  2. c语言---16 关于goto语句
  3. 手Q真的输给微信了吗?
  4. Linux系统学习方法论
  5. dynamo for Civil 3d-在横断面上生成对应桩号的平面坐标
  6. html怎么做向下的图标,用CSS和Bootstrap图标制作上下跳动的指示箭头动画效果
  7. PredRNN++:网络结构和代码解读
  8. sql server关系代数练习--进阶
  9. 百度网盘简易下载工具介绍
  10. 上海东方美谷JW万豪、福清喜来登、宁波杭州湾凯悦等酒店开业 | 中国酒店周刊...