GCC的常用编译选项(gcc编译工具)
liebian365 2025-04-05 20:00 4 浏览 0 评论
GCC(GNU Compiler Collection,GNU编译器套件)是由GNU开发的编程语言译器。
对于 C 语言源代码文件,使用 GCC 生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相互关联的步骤:预处理(Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
GCC 的编译选项有很多,在开发阶段,经常使用一些有用的警告选项来排查常见的代码 Bug,同时也是是检查代码正确性、提高代码鲁棒性的重要手段。
GCC 有很多编译选项,按照不同选项的功能划分,可以分为三类:
- 调试代码;
- 对目标文件进行优化;
- 检查代码质量。
下面是一个GCC常用的编译选项示例:
CFLAGS := -Wall -Wundef -Wshadow -Wconversion -Werror=return-type \
-Werror=implicit-function-declaration -Werror=unused-variable \
-fno-strict-aliasing -fno-common -fshort-wchar -fno-PIE \
-Wno-trigraphs -Os
对于调试版本,可将 -Os 替换为 -g -Og。
1、调试选项
为了能够正常使用 GDB 调试器调试程序,需要让编译器给编译目标添加额外的调试信息。
最常使用的就是 -g。
如果为了提升一些调试程序的性能,可以配合使用针对调试的优化选项 -Og。
2、优化选项
优化选项用于控制编译器对代码的优化等级,常用的是 -O2 和 -Os。
- -O0:默认选项,不执行任何优化;
- -Og:针对调试的优化选项,它会启用 -O1 的优化指令,同时获取到更多的调试信息;
- -O1:执行级别1的优化,尝试减少代码大小和提高性能,比如 -fdce(移除不可能执行到的代码),-fif-conversion(尝试简化if语句),-fmerge-constants(尝试合并相同的常量)。但是不包括需要花费大量编译时间的优化选项;
- -O2:执行 -O1 所有优化选项,同时额外执行几乎全部不需要在空间和性能之间平衡的优化选项。比如 -fgcse(优化全局公共表达式、常量的传递),-fcode-hoisting(将所有分支都需要执行的表达式尽早执行),-finline-functions(考虑将所有函数变成内联函数);
- -Os:专门用于优化代码大小的优化级别,执行 -O2 所有优化选项,同时排除那些可能导致程序大小增加的优化选项;
- -O3:最高优化等级,该优化级别较高,执行的优化不会很直观,可能也会出现一些问题,需要看实际情况选择是否使用。
3、警告选项
GCC编译器支持对代码进行诊断,针对代码中疑似错误或者可能存在风险的地方发出警告,警告编译选项就是用来控制需要告警的警告类型的。
- -Wall:常用的编译选项,用于启用一批比较常见且易于修改的警告,对代码进行基本的检查;
- -Wextra:单有 -Wall 可能还不够严格,-Wextra 作为补充,包括一些没有被 -Wall 包含的警告类型;
- -Werror:用于将所有警告视为错误。
一般启用特定类型警告的格式为 -Wxxx,排除特定类型的警告的格式为 -Wno-xxx。比如使用 -Wall -Wno-unused-variable 可以从- Wall 中排除 -Wunused-variable。
如果希望某些类型的警告被视为错误,可以使用 -Werror=xxx,比如-Werror=switch;反之,则可以使用 -Wno-error=xxx 不将该类型警告视为错误,比如 -Wno-error=switch。
常见的警告选项如下图所示。
相关推荐
- [西门子PLC] S7-1200PLC中所支持的数据类型详解
-
数据类型呢,就是讲数据的长度和属性的,也就是指定数据元素的大小,还有怎么去解释数据。每个指令起码得支持一种数据类型,有的指令还能支持好多种数据类型。所以呀,指令上用的操作数的数据类型一定得跟指令支持的...
- C语言wctomb函数详解:宽字符到多字节字符的「翻译官」
-
核心定位wctomb是C语言中用于将宽字符转换为多字节字符的「翻译官」,它能将单个宽字符(wchar_t)转换为多字节字符(如UTF-8编码的中文)。就像一位翻译官,它能将一种语言(宽字符)翻译成...
- Python 中数组和列表之间的区别(python列表和c语言数组区别)
-
在这篇文章中,您将了解Python中数组和列表之间的区别。Python列表Python列表是一种内置数据结构,是包含在方括号[]的元素集合。它们具有许多独特的属性,使它们与其他数据结构不同。有...
- Linux内核设计与实现—进程管理(linux内核原理与实现)
-
进程进程就是处于执行期的程序(目标码存放在某种存储介质上)。进并不仅仅局限于一段可执行程序代码(Unix称其为代码段,textsection)。通常进程还要包含其他资源,像打开的文件,挂起的信号,...
- 实际工程项目中西门子S7-1500如何批量读取和写入机器人信号
-
方法一:DPRD_DAT:读取DP标准从站的一致性数据该指令适用于中央模块以及DP标准从站和PROFINETIO设备。可以使用以下数据类型:BOOL,BYTE,CHAR,WCHAR,WO...
- C语言mbstowcs函数详解:多字节字符串到宽字符的「翻译官」
-
核心定位mbstowcs是C语言中用于将多字节字符串转换为宽字符字符串的「翻译官」,它能将多字节字符(如UTF-8编码的中文)转换为宽字符(wchar_t)。就像一位翻译官,它能将一种语言(多字节...
- C语言mbtowc函数详解:多字节字符到宽字符的「翻译官」
-
核心定位mbtowc是C语言中用于将多字节字符转换为宽字符的「翻译官」,它能将单个多字节字符(如UTF-8编码的中文)转换为宽字符(wchar_t)。就像一位翻译官,它能将一种语言(多字节字符)翻...
- 西门子PLC系列连载|No.5 初识西门子1200PLC数据类型
-
导语:在之前的文章中我们介绍了PLC的相关基础知识和一些小的程序段,也讲解过博途软件使用的一些基本方法。那么我们在本章内容将为大家讲解关于西门子1200系列PLC的常用数据类型,以及这些数据类型的区别...
- 计算机中常见的字符编码及存储方式
-
常见的字符编码ASCII、GBK、GB2312、Unicode等等常识用多个字节来代表的字符称之为宽字符,而Unicode码只是宽字符编码的一种实现,宽字符并不一定是Unicodechar窄字...
- 西门子SCL高级语言之数据转换介绍
-
(整数转浮点数INT_TO_REAL)我们在做项目中经常用到各种类型的数据,这就需要转换(CONVERT)指令来转换,由于博途数据转换指令只有它一个,那我们就只记住它就可以了,注意设置需要转换...
- SCL编程语言学习(2)-启保停电路(起保停电路plc程序)
-
“启保停”电路是学习过程中最常见的一个案例,也是最简单易懂的控制程序。如果采用梯形图编程,如图1所示。在实际工程的电路中,很少有这么简单的起保停电路,一般都需要考虑急停、限位、过载保护等多项因素,启停...
- GCC的常用编译选项(gcc编译工具)
-
GCC(GNUCompilerCollection,GNU编译器套件)是由GNU开发的编程语言译器。对于C语言源代码文件,使用GCC生成可执行文件的过程不仅仅是编译的过程,而是要经历四个相...
- 「C语言」初始化数组,C语言中初始化特定列表和元素
-
如果没有显式地初始化数组变量,那么就会采用一般规则:如果数组具有动态存储周期,那么数组元素的值就是没有定义的。否则,所有的元素都会被默认地初始化为0(如果数组元素是指针,则会被初始化为NULL)。编...
- C++11新特性(c++11新特性 lambda)
-
1、智能指针2、Lambda表达式3、线程库4、原子操作5、统一的列表初始化{}6、右值引用和移动构造7、引入nullptr指针8、类型推导auto和decltype智能指针:智能指针是一个...
- 西门子 S7-1200 PLC 数据类型详解
-
关注“PLC发烧友”,一起涨知识!回复:西门子全套,领西门子系列PLC电子资料包!数据类型用来描述数据的长度和属性,即用于指定数据元素的大小及如何解释数据,每个指令至少支持一个数据类型,而部分指令支持...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- wireshark怎么抓包 (75)
- qt sleep (64)
- cs1.6指令代码大全 (55)
- factory-method (60)
- sqlite3_bind_blob (52)
- hibernate update (63)
- c++ base64 (70)
- nc 命令 (52)
- wm_close (51)
- epollin (51)
- sqlca.sqlcode (57)
- lua ipairs (60)
- tv_usec (64)
- 命令行进入文件夹 (53)
- postgresql array (57)
- statfs函数 (57)
- .project文件 (54)
- lua require (56)
- for_each (67)
- c#工厂模式 (57)
- wxsqlite3 (66)
- dmesg -c (58)
- fopen参数 (53)
- tar -zxvf -c (55)
- 速递查询 (52)