CMake进阶(一)设置编译选项

2023-11-10

CMake设置编译选项

在cmake脚本中,设置编译选项可以通过add_compile_options命令,也可以通过set命令修改CMAKE_CXX_FLAGS或CMAKE_C_FLAGS。

使用这两种方式在有的情况下效果是一样的,但请注意它们还是有区别的:
add_compile_options命令添加的编译选项是针对所有编译器的(包括c和c++编译器),而set命令设置CMAKE_C_FLAGS或CMAKE_CXX_FLAGS变量则是分别只针对c和c++编译器的。

#判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持
if(CMAKE_COMPILER_IS_GNUCXX)
   add_compile_options(-std=c++11)
   message(STATUS "optional:-std=c++11")   
endif(CMAKE_COMPILER_IS_GNUCXX)

使用add_compile_options添加-std=c++11选项,是想在编译c++代码时加上c++11支持选项。但是因为add_compile_options是针对所有类型编译器的,所以在编译c代码时,就会产生如下warning

 J:\workspace\facecl.gcc>make b64 
   [ 50%] Building C object libb64/CMakeFiles/b64.dir/libb64-1.2.1/src/cdecode.c.obj 
   cc1.exe: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C 
   [100%] Building C object libb64/CMakeFiles/b64.dir/libb64-1.2.1/src/cencode.c.obj 
   cc1.exe: warning: command line option ‘-std=c++11’ is valid for C++/ObjC++ but not for C 
   Linking C static library libb64.a 
   [100%] Built target b64

虽然并不影响编译,但看着的确是不爽啊,要消除这个warning,就不能使用add_compile_options,而是只针对c++编译器添加这个option。
所以如下修改代码,则警告消除。

#判断编译器类型,如果是gcc编译器,则在编译选项中加入c++11支持
if(CMAKE_COMPILER_IS_GNUCXX)
    set(CMAKE_CXX_FLAGS "-std=c++11 ${CMAKE_CXX_FLAGS}")
    message(STATUS "optional:-std=c++11")   
endif(CMAKE_COMPILER_IS_GNUCXX)
举一反三,我们就可以想到,add_definitions这个命令也是同样针对所有编译器,一样注意这个区别。

构建Debug版本和Release版本

CMake文件设置

在Visual Studio中我们可以生成debug版本和release版本的程序,使用Cmake我们也可以达到同样的效果。debug版本的项目生成的可执行文件需要有调试信息并且不需要进行优化,而release版本的不需要调试信息但是需要优化。这些特性在gcc/g++中通过编译时的参数来决定的,如果将优化程度调到最高需要设置 -O3 ,最低的是 -O0 即不做优化,添加调试信息的参数是 -g -ggdb,如果不添加这个参数,调试信息就不会被包含在生成的二进制中

CMake中有一个变量CMAKE_BUILD_TYPE,可以取值枚举入下:Debug Release RelWithDebInfo 和 MinSizeRel

当这个变量值为Debug的时候,Cmake会使用变量CMAKE_FLAGS_DEBUG 和 CMAKE_C_FLAGS_DEBUG中的字符串作为编译选项生成Makefile,

当这个变量值为Release的时候,工程会使用变量CMAKE_CXX_FLAGS_RELEASE和CMAKE_CFLAGS_RELEASE选项生成Makefile。

现在假设项目中只有一个文件main.cpp,下面是一个可以选择生成debug版和release版的程序的CMakeList.txt:

1 PROJECT(main)
2 CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
3 SET(CMAKE_SOURCE_DIR .)
4
5 SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
6 SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
78 AUX_SOURCE_DIRECTORY(. DIR_SRCS)
9 ADD_EXECUTABLE(main ${DIR_SRCS})

第 5 和 6 行设置了两个变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_CXX_FLAGS_RELEASE, 这两个变量是分别用于 debug 和 release 的编译选项。 编辑 CMakeList.txt 后需要执行 ccmake 命令生成 Makefile

编译过程

一般Debug和Release应该在不同的目录下编译,否则每次当切换模式时必须把编译文件全部删掉。

这里假设新建两个目录Debug和Release来分别用于构建相应的模式:

Release 版本:

mkdir Release
cd Release
cmake -DCMAKE_BUILD_TYPE=Release …
make

Debug 版本:

mkdir Debug
cd Debug
cmake -DCMAKE_BUILD_TYPE=Debug …
make

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CMake进阶(一)设置编译选项 的相关文章

随机推荐

  • Canal实现Mysql数据同步至Redis、Elasticsearch

    文章目录 1 Canal简介 1 1 MySQL主备复制原理 1 2 canal工作原理 2 开启MySQL Binlog 3 安装Canal 3 1 下载Canal 3 2 修改配置文件 3 3 启动和关闭 4 SpringCloud集成
  • 【Lua】Table根据value排序

    使用lua开发需要把有用的数据全部存进Table里 lua也提供了一个sort接口来给table排序 但是sort的实现也是基于冒泡排序 他默认table的key是从1开始的 这样就会造成当我们的key是一些特殊的标志位 比如游戏中背包数据
  • 深入浅出JMS(二)--ActiveMQ简单介绍以及安装

    现实的企业中 对于消息通信的应用一直都非常的火热 而且在J2EE的企业应用中扮演着特殊的角色 所以对于它研究是非常有必要的 上篇博文深入浅出JMS 一 JMS基本概念 我们介绍了消息通信的规范JMS 我们这篇博文介绍一款开源的JMS具体实现
  • Ubuntu:配置环境变量的两种常用方法( .bashrc 和 /etc/profile )

    环境变量 什么是环境变量 简单地说 环境变量就是当前环境下的参数或者变量 如果说的专业一点就是指在操作系统中用来指定操作系统的一些参数 如最常见的环境变量 PATH 它的用途就是当用户要求系统运行一个程序而没有告诉它程序所在的完整路径时 系
  • iphone数据传输已取消怎么办_iPhone被停用怎么办?iPhone如何解除停用状态?

    面对iPhone已停用状态 我们该怎么解决 这或许会是很多人存在的疑问 有个好消息是 在你的iPhone被停用的情况下 我们还是有办法能够让iPhone复活 虽然 过程有点曲折 但是努力的话总归是有结果的 下面将为大家介绍下 iPhone被
  • c语言函数返回变量的地址,浅谈C语言函数返回值--局部变量和局部变量地址

    下面的内容是在C专家编程里面看到的 摘录于此 在C语言中 局部变量的作用域只在函数内部 在函数返回后 局部变量的内存就会被释放 如果函数只是返回局部变量 那么这个局部变量会被复制一份传回被调用处 但是如果函数返回的是局部变量的地址 那么就会
  • Vmware中鼠标移动时滚轮失效没反应Ubuntu20.04.1

    通过安装imwheel解决 先更新软件源 sudo apt get update 安装imwheel sudo apt get install imwheel 在 目录下创建 imwheelrc文件 cd sudo vim imwheelr
  • 使用Sklearn的SVM接口实现鸢尾花分类

    Iris Data Set Iris Data Set 鸢尾属植物数据集 是历史比较悠久的数据集 它首次出现在著名的英国统计学家和生物学家Ronald Fisher 1936年的论文 The use of multiple measurem
  • Docker安装Redis6

    1 拉取redis镜像 docker pull redis 6 2 创建redis映射目录 mkdir p usr local docker redis 3 下载redis conf到映射目录 cd usr local docker red
  • 数据挖掘而之数据清洗

    数据清洗 是整个数据分析过程中不可缺少的一个环节 其结果质量直接关系到模型效果和最终结论 在实际操作中 数据清洗通常会占据分析过程的50 80 的时间 国外有些学术机构会专门研究如何做数据清洗 相关的书籍也不少 美亚搜data cleani
  • CentOS7安装Redis5.0.5

    1 下载redis mkdir home redis cd home redis wget http download redis io releases redis 5 0 5 tar gz tar xzvf redis 5 0 5 ta
  • qt判断文件是否为空_Qt中文文档-QFile

    本项目地址 https github com QtDocumentCN QtDocumentCN github com QFile Class QFile 类提供读写文件的接口 bledata draft node block data d
  • LeetCode-1592-重新排列单词间的空格

    1592 重新排列单词间的空格 说明 给你一个字符串 text 该字符串由若干被空格包围的单词组成 每个单词由一个或者多个小写英文字母组成 并且两个单词之间至少存在一个空格 题目测试用例保证 text 至少包含一个单词 请你重新排列空格 使
  • kafka日志分段(.log文件)及日志文件索引机制(偏移量索引、时间戳索引)

    Kafka版本 2 2 1 环境 CDH 日志分段 segment 格式 在kafka数据存储的目录下 进入topic文件目录 可以看到多个文件 如下 从文件名可以看出 log index timeindex文件一一对应 rw r r 1
  • mysql 死锁_mysql死锁解读

    死锁 Deadlock 什么是死锁 所谓死锁 是指两个或两个以上的进程在执行过程中 因争夺资源而造成的一种互相等待的现象 若无外力作用 它们都将无法推进下去 此时称系统处于死锁状态或系统产生了死锁 这些永远在互相等待的进程称为死锁进程 由于
  • D - Halfway(二分)

    D Halfwayhttps vjudge csgrandeur cn problem Gym 101652Q 暴力 include
  • 常用的/etc/my.cnf配置,可以修改后直接替换

    client port 3378 socket tmp mysql sock default character set utf8 mysql safe updates default character set utf8 prompt u
  • JAVA基础知识点

    一 概述 JAVA语言是美国Sun公司 Stanford University Network 在1995年推出的高级变成语言 2009年Oracle甲骨文公司收购Sun公司 并于2011年发布Java7版本 DOS命令 Win R cmd
  • 2022 年度软件质量保障行业调查报告

    2022 年度软件质量保障行业调查报告 TesterHome https testerhome com topics 35615 覆盖的测试类型 个人提升工作效率的方式 优秀测试人员应该具备的能力 测试同行们的未来计划 阻碍测试进度的因素
  • CMake进阶(一)设置编译选项

    CMake 进阶 一 设置编译选项 CMake设置编译选项 构建Debug版本和Release版本 CMake文件设置 编译过程 CMake设置编译选项 在cmake脚本中 设置编译选项可以通过add compile options命令 也