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

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

编译不同语言CC++语言用的标记不同

当这个变量值为Debug的时候,

C:Cmake会使用变量CMAKE_C_FLAGS_DEBUG中的字符串作为编译选项生成Makefile;

C++:Cmake会使用变量CMAKE_CXX_FLAGS_DEBUG中的字符串作为编译选项生成Makefile;

当这个变量值为Release的时候,

C:Cmake会使用变量CMAKE_C_FLAGS_RELEASE中的字符串作为编译选项生成Makefile;

C++:Cmake会使用变量CMAKE_CXX_FLAGS_RELEASE中的字符串作为编译选项生成Makefile;

其他选项以此类推,RelWithDebInfo  和  MinSizeRel

指定C和C++使用特定的编译器

set(CMAKE_C_COMPILER "/usr/local/gcc")   //指定编译器的路径即可

set(CMAKE_CXX_COMPILER "/usr/local/g++")    //指定编译器的路径即可

cmake -DCMAKE_C_COMPILER=/path/to/gcc/bin/gcc   -DCMAKE_CXX_COMPILER=/path/to/gcc/bin/g++  .

另外一种方式如下,但该种方式将影响该机器上所有的项目编译

export CC=/usr/local/bin/gcc
export CXX=/usr/local/bin/g++
cmake /path/to/your/project
make

以下网址有详细说明

https://stackoverflow.com/questions/17275348/how-to-specify-new-gcc-path-for-cmake

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

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

第 4和5 行设置了两个变量 CMAKE_CXX_FLAGS_DEBUG 和 CMAKE_CXX_FLAGS_RELEASE, 这两个变量是分别用于 debug 和 release 的编译选项。 编辑 CMakeList.txt 后需要执行 ccmake 命令生成 Makefile 。在进入项目的根目录,输入 "ccmake ." 进入一个图形化界面,如下图所示:

ccmake的界面

执行了configure后的ccmake的界面

下面我们首先生成debug版的Makefile:将变量CMAKE_BUILD_TYPE设置为Debug,按“c”进行configure,按“g”生成Makefile并推出。这时执行命令 find * | xargs grep  “O0”后结果如下:

执行命令 find * | xargs grep  “O0”后的结果

CMakeFiles/main.dir/flags.make:CXX_FLAGS = -O0 -Wall -g -ggdb
CMakeFiles/main.dir/link.txt:/usr/bin/c++ -O0 -Wall -g -ggdb
CMakeFiles/main.dir/main.cpp.o -o main -rdynamic
CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")

这个结果说明生成的 Makefile 中使用了变量 CMAKE_CXX_FLAGS_DEBUG 作为编译时的参数。

下面我们将生成Release版本的Makefile:再次执行“ccmake ." ,将变量CMAKE_BUILD_TYPE设置为Release,生成Makefile并推出。执行命令 find * | xargs grep  “O0”后结果如下:

find * | xargs grep "O0"的执行结果

CMakeLists.txt:SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")

而执行命令 find * | xargs grep "O3" 后结果如下:

CMakeCache.txt:CMAKE_CXX_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
CMakeCache.txt:CMAKE_C_FLAGS_RELEASE:STRING=-O3 -DNDEBUG
CMakeFiles/main.dir/flags.make:CXX_FLAGS = -O3 -Wall
CMakeFiles/main.dir/link.txt:/usr/bin/c++ -O3 -Wall
CMakeFiles/main.dir/main.cpp.o -o main -rdynamic
CMakeLists.txt:SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")

这两个结果说明生成的Makefile中使用了CMAKE_CXXFLAGS_RELEASE,作为编译时的参数

Cmake生成debug版本和release版本相关推荐

  1. 蠢哭了,debug版本可用release版本出错

    记录一下本人遇到的问题,可能不适用于各位. win10 vs2015  MFC编写的一个动态库dll工程,debug版本release版本编译都通过.但是运行时debug版本可用 release版本出 ...

  2. Maven的Snapshot版本与Release版本

    1. Snapshot版本代表不稳定.尚处于开发中的版本 2. Release版本则代表稳定的版本 3. 什么情况下该用SNAPSHOT?  协同开发时,如果A依赖构件B,由于B会更新,B应该使用SN ...

  3. snapshots版本和release版本间的区别

    snapshots版本和release版本间的区别 在java开发过程中,我们经常会看到代码仓库中的某些项目版本以release或snapshots结尾,一般来说snapshots版本代表正在开发中的 ...

  4. snapshots版本和release版本区别

    snapshot版本和release版本区别 在java开发过程中,我们经常会看到代码仓库中的某些项目版本以release或snapshots结尾,现在说说这两个版本之间有什么区别. 一般来说snap ...

  5. Maven 的 Snapshot 版本与 Release 版本

    Maven 的 Snapshot 版本与 Release 版本 1.Snapshot 版本代表不稳定.尚处于开发中的版本. 2.Release 版本则代表稳定的版本. 3.什么情况下该用 SNAPSH ...

  6. VS.Net中程序集的Debug版本和Release版本的区别

    作者:未知   请作者速与本人联系 前几天看到豆腐的文章介绍如何知道程序集是Debug版还是Release版,之前只知道某些软件从功能上有企业版.标准版之分,却从不知道.Net程序集还有Debug和R ...

  7. VC++调试程序、快捷键以及Debug版本与Release版本

    1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Release状态.C/C++标签中的Category选General, ...

  8. c++中的Debug版本和Release版本的区别

    今天看Visual C++ 2012 入门经典,书上描述: Debug版本包括帮助用户调试程序的信息,使用程序的Debug版本,可以在出现问题时单步执行代码,以检查程序中的数据值. Release版本 ...

  9. debug版本和release版本的区别

    Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用. ...

最新文章

  1. English trip -- VC(情景课)1 D
  2. Makefile_01:什么是Makefile?
  3. 阿里云计算平台招AI解决方案产品经理
  4. webpack4-- 处理html中引入的图片
  5. ArcGIS实验教程——实验七:矢量数据空间校正(Spatial Adjustment)
  6. java的case_java中的switch case语句使用详解
  7. 百度启动史上规模最大校园招聘;荣耀Magic3系列售价4599元起;阿里成立反职场陋习小组,无条件支持员工拒绝劝酒|极客头条...
  8. 微信小程序 encryptedData 的解密(JAVA)
  9. mysql之获取自增长的ID
  10. js获取post请求参数_SpringMVC请求参数获取时,有这六种方式值得学习
  11. 关于APP测试用例点
  12. 一个人被提拔,不仅仅是能力,而是信任
  13. 多包管理工具lerna搭建项目---基本常用命令
  14. 国密算法—SM2介绍及基于BC的实现
  15. 下载文件时设置文件名的方法
  16. 关于支付宝沙箱支付时提示系统有点儿忙,一会再试试解决方案
  17. html 老人机可以播放吗,宏强数字能量:通过手机号码看老年人身体健康
  18. (十五)路过师大 - 4
  19. Facebook React完全解析
  20. java 建行接口_中国建设银行网上支付接口以及自动对账

热门文章

  1. i7 11700kf对比i710700kf 差距大不大
  2. 文件 备份 服务器失败怎么办啊,SMO“恢复服务器失败”从文件恢复备份
  3. DM8 DEM 部署
  4. YOLO,You Only Look Once论文翻译——中英文对照
  5. 朴素贝叶斯算法Sklearn实现的学习笔记
  6. 5G下CDN技术与产业发展变化,将会如何引领时代发展?
  7. DotNetBar界面按钮设置
  8. 旋转矩阵表示姿态XYZ坐标轴关系
  9. JVM内存区域划分Eden Space\Survivor Space\Tenured Gen\Perm Gen
  10. HyperMesh画网格备忘录