gcc中的debug版本和release版本

gcc编译可执行文件和cmake编译可执行文件 使用gcc,cmake编译 阅读详情

结论:Gcc中并没有Release和debug版本之分,只有编译选项的组合

大学时候使用VS开发,VS编译的程序是可以选debug或者release的,搞得我一直误以为使用gcc编译,也有这种区分。


详细介绍

1 优化参数 -Os的使用

Note that gcc doesn’t have a “release mode” and a “debug mode” like MSVC does. All code is just code. The presence of the various optimization options (-O2 and -Os are the only ones you generally need to care about unless you’re doing very fine tuning) modifies the generated code, but not in a way to prevent interoperability with other ABI-compliant code. Generally you want optimization on stuff you want to release.

没有特别需求的情况下,gcc编译选项你只需要关注-Os这个选项,这个选项主要是对代码做优化的。

  1. -O0,-O1: the compiler tries to reduce code size and execution time, without performing any optimizations that take a great deal of compilation time.
  2. -O2:Optimize even more. GCC performs nearly all supported optimizations that do not involve a space-speed tradeoff. As compared to -O, this option increases both compilation time and the performance of the generated code.
  3. -O3:Optimize yet more. -O3 turns on all optimizations specified by -O2 and also turns on the extended optimization flags.

根据我已知的资料,O3的优化在某些时候可能会有问题,gcc对O3的实现估计有问题,所以最好只用到O2,O3不要用

2 调试信息的产生:-g

The presence of the “-g” option will cause extended symbol and source code information to be placed in the generated files, which is useful for debugging but increases the size of the file (and reveals your source code), which is something you often don’t want in “released” binaries.

But they’re not exclusive. You can have a binary compiled with optimization and debug info, or one with neither.

-g只是说要不要导出符号表到程序里面,它可以跟 -0s组合使用,比如:-O2 -g,即优化代码又导出符号表。

有时候我们使用了-g,使用gdb调试的时候,会出现“No symbol xxx in current context”
这样的问题。
这是因为比较新的gcc版本导出的符号格式默认是DWARF4,比较老的gdb版本无法识别这种格式。
这种问题可以通过加 -gdwarf-2或者-gdwarf-3告诉gcc,产生老版本的符号信息,这样老版本的gdb就
能识别

reference

[1] https://stackoverflow.com/questions/1534912/how-to-build-in-release-mode-with-optimizations-in-gcc

[2] http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

[晕事]今天做了件晕事64,perf, gcc-O2 从perf抓的数据看每个线程,每个函数的使用都很平均,而且通过反汇编看,也都是正常的业务逻辑。那是为什么比原来程序的CPU使用要多呢?最后幸好这个同事想起来,新的binary是debug版本,而之前的版本是release版本,这就是apple-to-apple的对比标准需要得到落实的原因。在debug版本没有添加gcc的-O2选项,而release版本加了,这个性能差异就出来了。其实也不是这么突然,而是因为换了一个新的binary之后才出现的问题。最近和同事看一个程序突然CPU使用率增加的问题。 阅读详情

相关推荐

一桶令牌的时间账本:四类限流算法的边界推演与Guava RateLimiter源码精读

限流的难点不在背出算法名,而在算清每一笔账:按哪一秒计数、超额请求排队还是拒绝、空闲后能否突发、集群总量如何约束。本文在可复现的虚拟时间实验台上对比固定窗口、滑动窗口、漏桶与令牌桶,实测边界双倍突发与分桶滑动的真实上界,拆解Nginx limit_req的千分位记账与延迟机制,纠正Resilience4j常被误称漏桶的说法,并逐行精读Guava SmoothRateLimiter的预消费、懒惰补账与预热积分,复刻迷你限流器与其完成七万次零差异对账,最后给出集群配额、分层防护与参数确定的方法。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 86万+

vim简单使用、gcc编译器使用与gdb调试、makefile使用

gcc的使用、gdb调试、makefile文件命令使用以及vim编辑器使用

曾几何时的博客 4787

基于SpringBoot 3 + Vue 3的全栈民宿预约管理系统设计与实现

文章将详细阐述系统的需求分析、架构设计、数据库设计、核心功能模块的实现(包括用户认证、房源管理、订单流程、支付集成等),并提供关键代码片段,最后对系统进行总结与展望。.requestMatchers("/api/admin/**").hasRole("ADMIN") // 管理员接口。.requestMatchers("/api/auth/**").permitAll() // 认证接口公开。.requestMatchers("/api/public/**").permitAll() // 公开资源。

2201_76125393的博客 272

【Linux系统编程五】:谈gcc/g++使用及原理 + 动静态库介绍 + debug与release模式

深入篇【Linux】学习必备:本篇主要谈三个方面,第一方面:gcc/g++是如何完成程序的翻译过程?。第二方面:动静态库介绍。第三方面:debug与release模式。

Extreme_wei的博客 1797

【OpenClaw企业级智能体实战】第10篇:医疗行业OpenClaw实战:病历自动书写、医保智能审核与患者随访管理(附HIPAA合规配置+完整代码)

医疗行业正面临“效率提升需求”与“合规监管红线”的双重矛盾:病历书写占据医生30%-50%工作时间,医保审核效率低下,患者随访工作量巨大,但医疗数据“不出域”“责任不转移”的要求又限制了AI落地。本文基于华为云、腾讯云安全规范及中关村科金、复旦大学附属中山医院等真实实践,拆解OpenClaw在医疗场景的五大核心应用(病历自动书写、医保智能审核、患者随访管理、科研文献综述、医学影像预处理),提供私有化部署架构、HIPAA合规配置模板、完整实操流程及可直接运行的代码。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 438

【AI理论学习】手把手推导扩散模型:Diffusion Models(DDPM)

生成扩散模型DDPM如下图所示分为前向、逆向两个过程,它首先通过不断往原始清晰数据中添加噪声使其变成标准高斯噪声(前向过程),而后期望从标准高斯噪声中还原原始数据(逆向过程)。若能实现,那便可从已知的标准高斯分布中采样一个噪声数据,而后利用DDPM模型生成符合原始数据分布的新数据。 Diffusion模型包含两个过程:数学符号:y∝xy\propto xy∝x:y正比于x,即y随着x增大而线性增大。 条件概率:贝叶斯公式:p(A∣B)=p(B∣A)×p(A)p(B)p(A|B)=\frac{p(B|A)\

小哲的博客 1508

gcc编译debug和release版本软件

debug版本的软件目的是为了调试软件;release版本是用来发布的。很明显debug的版本的软件必然包含很多信息:代码中的函数名,源代码的文件名和行数,编译出来的目标文件的偏移量。使用addr2line 和文件位置偏移量,就可以得到对应的函数名和源文件以及行数。release版本的软件这些信息就没有必要了。gcc给工程师提供了编译参数来控制这些。添加-g参数可以使得编译的程序包含更多调试信息,...

lc999102的专栏 1万+

RD算法(一)初出茅庐 —— 算法原理

在《SAR成像概述》的第4节已经对各种SAR成像算法进行了一个简要的概述,本文就直接从RD算法讲起了。

5282

gcc / g++ Debug 模式

Debug / release模式   Debug模式下的代码比release模式具有更多的检测,比如在windows平台上assert宏只在release模式下有效。Linux上则没有这个限制,无论Debug还是release模式assert都生效,但是如果你想让assert失效,编译的时候 加上 -DNDEBUG 即可。 Debug检测   我们都说了Debug模式可以帮我们检测一些东西...

我喜欢雨天的清新的博客 1万+

FM1288回声消除芯片调试方案 - 综述

专栏文章概览

优快云mianfeixiazai001的博客 1713

OpenHarness代码解读

Harness 是包裹在大模型之外、为其赋予完整执行能力的全套基础设施。模型负责提供智能与推理,Harness 则为模型提供感知、行动、记忆、工具与安全约束,使其从语言模型变成可自主完成复杂任务的实用智能体。我这里把向量数据库方案定义为:把对话片段、事件、偏好、工具结果等切成 memory chunks,做 embedding,存进向量库,查询时靠 ANN 相似度召回,再交给 LLM 读。AAAI 的综述类论文就明确指出,很多 LLM agent 的长期记忆就是这么做的。AAAI 期刊把文件系统方案。

qq_52053775的博客 187

GCC的DEBUG和release版本编译方法

利用gcc的 -DDEBUG选项。 1. 源文件DEBUG.c中有: #include int main(int argc, char *argv[]) { #ifdef DEBUG     printf("DEBUG is definded \n"); #else     printf("DEBUG is not definded \n"); #endif } 2. Ma

Blaider的专栏 2万+

嵌入式工程师成长之路(0)----认识元件

在电子设计与维修中,认识元件是成功的关键!面对琳琅满目的电阻、电容、电感与二极管,样子形式千奇百怪,你是否也曾陷入困难? 本文基于行业权威分类标准,结合十年工程师实战经验,深度解析4大类、30+子类电子元件的核心特性、应用场景与避坑指南,助你从“小白”秒变“电子高手”!

云轩阁 11万+

makefile[一]:编译选项,debug/release版本 + gcc 编译选项

makefile: wildcard eval call说明1. wildcard2. eval3. call 1. wildcard wildcard 它被展开为已经存在的,使用空格分开的,匹配此模式的所有文件列表。 一般我们可以使用“$(wildcard *.c) 来获取目录下所有的.c文件 2. eval eval $(eval xxx) 意思是将xxx 的内容作为makefile 的一...

哈尼的博客 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

GCC编译Debug版本正常,Release版本异常

解决方法: 使用检查工具(如cppcheck)或者编译时查看warning信息,将所有的warning修复。 主要检查每个函数的返回值是否遗漏,若遗漏,则两个版本的结果会不同,Release版本一般行为比较怪异。 ...

space01的专栏 524

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Release和Debug的区别

Release和Debug的区别 文章目录Release和Debug的区别1. debug 和 release 版本有什么不同1.1 在VS中的区别2. gcc 下 release 版本与 debug 版本的控制 1. debug 和 release 版本有什么不同 Debug:Debug 通常称为调试版本,通过一系列编译选项的配合,编译的结果通常包含调试信息,而且不做任何优化,以为开发人员提供 ...

一叶知秋的博客 3万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

0033__GCC的DEBUG和release版本编译方法

https://blog.youkuaiyun.com/blaider/article/details/7043444

行潇 784

【GCC】生成debug、release、32位版与64位版|gcc参数和DEBUG条件编译

目录 利用gcc的 -DDEBUG选项。 GCC64生成32位版与64位版、debug版与release版 GCC常用参数详解 《 gcc命令》 http://man.linuxde.net/gcc 利用 -DDEBUG选项条件编译 1. 源文件test.c中有: #...

小鱼菜鸟的博客 586

linux编译32位的参数,【gcc参数和DEBUG条件编译】GCC的debug、release、32位版与64位版编译...

GCC 64 32位版与64位版、debug版与release版http://blog.youkuaiyun.com/holandstone/article/details/7956109为了适应现在越来越流行的64位系统,经常需要将代码分别编译为32位版和64位版。其次,除了需要生成debug版用于开发测试外,还需要生成release版用于发布。本文介绍了如何利用makefile条件编译来生成这些版本,而且...

weixin_29067143的博客 1132

GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)

GCC 64位程序的makefile条件编译心得——32位版与64位版、debug版与release版(兼容MinGW、TDM-GCC)   为了适应现在越来越流行的64位系统,经常需要将代码分别编译为32位版和64位版。其次,除了需要生成debug版用于开发测试外,还需要生成release版用于发布。本文介绍了如何利用makefile条件编译来生成这些版本,而且不仅兼容Linux下的G

远有青山 1万+

Android c++ Release 和debug版本区别

这两天遇到一个非常郁闷的问题,好不容易把debug版本调试通类,功能也多实现类,编译成release版本,居然有的文件无法打开,有的图像显示的颜色不正确,按照正常的思路,是预debug宏定义相关,可是Rester.cpp检查了好几遍,没有定义debug宏,我把其他的文件编译成Re

hgl868的专栏 1万+

【GCC】gcc条件编译和make 传参gcc|Makefile 带参数

gcc条件编译 myprogram.c代码中: #ifdef UMP_TO_FILE //do something here... #endif gcc编译时: gcc myprogram.c -DUMP_TO_FILE -D加上宏UMP_TO_FILE,相当于你在代码中#defineUMP_TO_FILE -D UMP_TO_FILE = 1,相当于你在代码中#defineUMP_TO_FILE 1 -D name Predefine name as a macro, ...

我的笔记本 3168

scons实践笔记(2)--带选项的编译

(1)如果想要生成两个编译器版本的代码,比如在PC机上的GCC编译和ARM linux gcc交叉编译,并且在编译的时候可以选择,SConstruct内容如下,源代码测试文件还是前一个hello world程序: > vim SConstruct src = Glob('*.c') platform = ARGUMENTS.get('platform','pc') if p

woyaozuo2012的专栏 8436

是不是VC6的bug -- 该用short就用short,不敢乱用int了

下面的代码,DEBUG版本运行时,结果正确。可是RELEASE版本运行时,结果错误:==========================================out frame: 0inner framer: 0out...

229
上一篇: Eigen不同的方法来求矩阵的逆的效率
下一篇: Eigen实现matlab中的reshape
Feisy
博客等级 码龄19年 166粉丝 235原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值