GCC的常用编译选项

GCC的常用编译选项

编码文章call10242025-01-14 10:29:5819A+A-

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。

常见的警告选项如下图所示。

点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4