代码在git
假设我们有个main.c,其内容如下

#include <stdio.h>int main(void)
{#ifdef WWW1printf("hello world1\n");
#endif    #ifdef WWW2     printf("hello world2\n");
#endifreturn 0;
}

可以通过定义宏来控制打印的信息,我们CMakeLists.txt内容如下,

cmake_minimum_required(VERSION 3.5)project(demo)set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)option(WWW1 "print one message" OFF)
option(WWW2 "print another message" OFF)if (WWW1)add_definitions(-DWWW1)
endif()if (WWW2)add_definitions(-DWWW2)
endif()add_executable(main main.c)

这里把option的名字保持和main.c里的宏名称一致,这样更加直观,也可以选择不同的名字。通过与add_definitions()的配合,就可以控制单个bin文件的打印输出了。

整体工程结构如下

.
├── bin
├── build
├── CMakeLists.txt
└── main.c

cd到build目录下执行cmake … && make,然后到bin目录下执行./main,可以看到打印为空,
接着分别按照下面指令去执行,然后查看打印效果

  • cmake … -DWWW1=ON -DWWW2=OFF && make
  • cmake … -DWWW1=OFF -DWWW2=ON && make
  • cmake … -DWWW1=ON -DWWW2=ON && make

这里有个小坑要注意下:假设有2个options叫A和B,先调用cmake设置了A,下次再调用cmake去设置B,如果没有删除上次执行cmake时产生的缓存文件,那么这次虽然没设置A,也会默认使用A上次的option值。

所以如果option有变化,要么删除上次执行cmake时产生的缓存文件,要么把所有的option都显式的指定其值。

Linux下CMake简明教程(10) 定义宏来控制打印的信息相关推荐

  1. Linux下CMake简明教程(二)同一目录下多个源文件

    代码在git 接下来进入稍微复杂的例子:在同一个目录下有多个源文件.在之前的目录下添加2个文件,testFunc.c和testFunc.h.添加完后整体文件结构如下, (base) ledi@ledi ...

  2. Linux下CMake简明教程(九) 添加控制选项

    代码在git 有时希望在编译代码时只编译一些指定的源码,可以使用cmake的option命令,主要遇到的情况分为2种: 本来要生成多个bin或库文件,现在只想生成部分指定的bin或库文件 对于同一个b ...

  3. Linux下CMake简明教程(一)简单入门

    代码链接 CMake是开源.跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件 ...

  4. Linux下CMake简明教程(七)对库进行链接

    代码在git 既然我们已经生成了库,那么就进行链接测试下.重新建一个工程目录,然后把上节生成的库拷贝过来,然后在在工程目录下新建src目录和bin目录,在src目录下添加一个main.c,整体结构如下 ...

  5. Linux下CMake简明教程(六)动态库和静态库的编译控制

    代码在git 有时只需要编译出动态库和静态库,然后等着让其它程序去使用.让我们看下这种情况该如何使用cmake.首先按照如下重新组织文件,只留下testFunc.h和TestFunc.c ├── CM ...

  6. Linux下CMake简明教程(五)正规一点的组织结构

    代码在git 正规一点来说,一般会把源文件放到src目录下,把头文件放入到include文件下,生成的对象文件放入到build目录下,最终输出的elf文件会放到bin目录下,这样整个结构更加清晰.让我 ...

  7. Linux下CMake简明教程(八) 添加编译选项

    代码在git 有时编译程序时想添加一些编译选项,如-Wall,-std=c++11等,就可以使用add_compile_options来进行操作. 这里以一个简单程序来做演示,main.cpp如下 # ...

  8. Linux下CMake简明教程(四)不同目录下多个源文件

    代码在git 一般来说,当程序文件比较多时,我们会进行分类管理,把代码根据功能放在不同的目录下,这样方便查找.那么这种情况下如何编写CMakeLists.txt呢? 我们把之前的源文件整理一下(新建2 ...

  9. Linux下CMake简明教程(三)同一目录下多个源文件

    如果在同一目录下有多个源文件,那么只要在add_executable里把所有源文件都添加进去就可以了.但是如果有一百个源文件,再这样做就有点坑了,无法体现cmake的优越性,cmake提供了一个命令可 ...

最新文章

  1. 八种架构设计模式及其优缺点概述
  2. 使用pandas处理时间变量
  3. GrowingIO创始人兼CEO张溪梦:互联网下半场,数据如何驱动企业突破增长重围?
  4. Datawhale 一周年,生日快乐!
  5. mysql 内连接条件_Mysql内连接有OR条件?
  6. openstack根据公网查不到路由_从零入门 Serverless | SAE 场景下,应用流量的负载均衡及路由策略配置实践...
  7. lambda java 接口_lambda – Java 8中的功能接口是什么“功能形状”?
  8. 从编程小白到全栈开发:服务的调用
  9. Seven Kinds of Testers - 七种类型的测试
  10. python3根据图片链接下载图片
  11. 广西南宁机器人比赛_广西南宁中小学生机器人竞赛精彩纷呈
  12. 畅销书热榜html网页制作,黑色简洁形式pc+wap畅销书作者介绍网页模板代码
  13. Kotlin语言内置函数学习2:with,also,takeIf,takeUnless
  14. JAVA设计表情包制作程序_MSNLite表情包制作生成器(Java实现)
  15. CSS3中的伪元素选择器与scss
  16. axios与拦截器的简单结合
  17. Android开发最近新闻和功能都在这里了
  18. mysql数据库之字段类型
  19. DDoS 攻击的趋势
  20. 使用vue完成点击鼠标产生小心心特效

热门文章

  1. 基于CASIA-GaitDatasetB步态图像轮廓数据库的步态周期检测与步态角度特征MATLAB源码
  2. 设备树之GPIO和中断实例
  3. Oracle 12c 安装(内附软件包)
  4. 基于go搭建微服务实践教程 (概览)
  5. 狮山路将装上“智慧大脑”
  6. Hadoop何以快速成为最佳网络安全工具?
  7. 利用http协议发布博文评论
  8. 【转载】设计模式_六大原则(学习)
  9. 阿尔法狗要逆天!韩专家称其故意输李世石一局
  10. Fuxi ServiceModeJob 多租户(Quota Group) 功能介绍