Cmake生成debug版本和release版本
在Visual Studio中我们可以生成debug版本和release版本的程序,使用Cmake我们也可以达到同样的效果。debug版本的项目生成的可执行文件需要有调试信息并且不需要进行优化,而release版本的不需要调试信息但是需要优化。这些特性在gcc/g++中通过编译时的参数来决定的,如果将优化程度调到最高需要设置 -O3 ,最低的是 -O0 即不做优化,添加调试信息的参数是 -g -ggdb,如果不添加这个参数,调试信息就不会被包含在生成的二进制中, -Wall 显示报警信息
CMake中有一个变量CMAKE_BUILD_TYPE,可以取值枚举入下:Debug Release RelWithDebInfo 和 MinSizeRel
编译不同语言C和C++语言用的标记不同
当这个变量值为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版本相关推荐
- 蠢哭了,debug版本可用release版本出错
记录一下本人遇到的问题,可能不适用于各位. win10 vs2015 MFC编写的一个动态库dll工程,debug版本release版本编译都通过.但是运行时debug版本可用 release版本出 ...
- Maven的Snapshot版本与Release版本
1. Snapshot版本代表不稳定.尚处于开发中的版本 2. Release版本则代表稳定的版本 3. 什么情况下该用SNAPSHOT? 协同开发时,如果A依赖构件B,由于B会更新,B应该使用SN ...
- snapshots版本和release版本间的区别
snapshots版本和release版本间的区别 在java开发过程中,我们经常会看到代码仓库中的某些项目版本以release或snapshots结尾,一般来说snapshots版本代表正在开发中的 ...
- snapshots版本和release版本区别
snapshot版本和release版本区别 在java开发过程中,我们经常会看到代码仓库中的某些项目版本以release或snapshots结尾,现在说说这两个版本之间有什么区别. 一般来说snap ...
- Maven 的 Snapshot 版本与 Release 版本
Maven 的 Snapshot 版本与 Release 版本 1.Snapshot 版本代表不稳定.尚处于开发中的版本. 2.Release 版本则代表稳定的版本. 3.什么情况下该用 SNAPSH ...
- VS.Net中程序集的Debug版本和Release版本的区别
作者:未知 请作者速与本人联系 前几天看到豆腐的文章介绍如何知道程序集是Debug版还是Release版,之前只知道某些软件从功能上有企业版.标准版之分,却从不知道.Net程序集还有Debug和R ...
- VC++调试程序、快捷键以及Debug版本与Release版本
1.如何在Release状态下进行调试 Project->Setting=>ProjectSetting对话框,选择Release状态.C/C++标签中的Category选General, ...
- c++中的Debug版本和Release版本的区别
今天看Visual C++ 2012 入门经典,书上描述: Debug版本包括帮助用户调试程序的信息,使用程序的Debug版本,可以在出现问题时单步执行代码,以检查程序中的数据值. Release版本 ...
- debug版本和release版本的区别
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序.Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用. ...
最新文章
- English trip -- VC(情景课)1 D
- Makefile_01:什么是Makefile?
- 阿里云计算平台招AI解决方案产品经理
- webpack4-- 处理html中引入的图片
- ArcGIS实验教程——实验七:矢量数据空间校正(Spatial Adjustment)
- java的case_java中的switch case语句使用详解
- 百度启动史上规模最大校园招聘;荣耀Magic3系列售价4599元起;阿里成立反职场陋习小组,无条件支持员工拒绝劝酒|极客头条...
- 微信小程序 encryptedData 的解密(JAVA)
- mysql之获取自增长的ID
- js获取post请求参数_SpringMVC请求参数获取时,有这六种方式值得学习
- 关于APP测试用例点
- 一个人被提拔,不仅仅是能力,而是信任
- 多包管理工具lerna搭建项目---基本常用命令
- 国密算法—SM2介绍及基于BC的实现
- 下载文件时设置文件名的方法
- 关于支付宝沙箱支付时提示系统有点儿忙,一会再试试解决方案
- html 老人机可以播放吗,宏强数字能量:通过手机号码看老年人身体健康
- (十五)路过师大 - 4
- Facebook React完全解析
- java 建行接口_中国建设银行网上支付接口以及自动对账
热门文章
- i7 11700kf对比i710700kf 差距大不大
- 文件 备份 服务器失败怎么办啊,SMO“恢复服务器失败”从文件恢复备份
- DM8 DEM 部署
- YOLO,You Only Look Once论文翻译——中英文对照
- 朴素贝叶斯算法Sklearn实现的学习笔记
- 5G下CDN技术与产业发展变化,将会如何引领时代发展?
- DotNetBar界面按钮设置
- 旋转矩阵表示姿态XYZ坐标轴关系
- JVM内存区域划分Eden Space\Survivor Space\Tenured Gen\Perm Gen
- HyperMesh画网格备忘录