news 2026/11/4 10:42:04

【建议收藏】GCC 编译器常用选项速查表(附助记词)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【建议收藏】GCC 编译器常用选项速查表(附助记词)

作者:嵌入式兔哥

简介:在嵌入式开发中,GCC 是我们最忠实的伙伴。很多兄弟可能只习惯用 IDE 的一键编译,但一旦转战 Linux 环境或编写 Makefile,理解 GCC 的这些参数就成了基本功。今天兔哥帮大家整理了一份“不求人”的 GCC 常用选项速查表,配合助记词,助你过目不忘!

类别选项助记(全称)作用示例及解释
库与头文件用法-IInclude指定头文件的搜索路径。



告诉编译器去哪里找.h文件。
gcc main.c -I ./inc



(解释:编译时额外在./inc目录寻找头文件)
-llibrary指定要链接的库名。



库名需去掉前缀lib和后缀.so。
gcc main.c -lpthread



(解释:链接libpthread.so线程库)
-LLib path指定库文件的搜索路径。



告诉编译器去哪里找.so或.a文件。
gcc main.c -L ./lib



(解释:链接时额外在./lib目录寻找库文件)
编译流程-EPrE-process只进行预处理,既不编译,也不汇编。



主要处理#include、#define等。
gcc -E main.c -o main.i



(解释:生成.i预处理文件,用于检查宏展开)
-SASsembly只编译,不汇编。



将 C 代码转换为汇编代码。
gcc -S main.c -o main.s



(解释:生成.s汇编文件,用于查看底层指令)
-ccompile编译并汇编,但不进行链接。



将汇编代码转换为机器码。
gcc -c main.c -o main.o



(解释:生成.o目标文件,用于多文件编译)
-ooutput小写字母“o”,指定生成的可执行文件的名字。



不指定的话生成的可执行文件名为a.out。
gcc main.c -o app



(解释:生成名为app的可执行文件)
调试与优化-gDebug生成调试信息。



方便 GDB 或 VSCode 进行断点调试。
gcc -g main.c -o app



(解释:生成包含调试符号的程序,体积稍大)
-O0~-O3Optimize指定优化等级。



-O0不优化(调试用);-O2标准优化(发布用)。
gcc -O2 main.c -o app



(解释:使用 Level 2 级别优化代码性能)
-WallWarningAll开启所有警告。



强烈建议使用,能发现潜在 Bug。
gcc -Wall main.c -o app



(解释:打印出所有可能的代码警告信息)
嵌入式软件常用-DDefine定义宏。



等同于在代码里写#define,常用于条件编译。
gcc main.c -DDEBUG



(解释:在命令行定义 DEBUG 宏,激活调试代码)
-staticstatic静态链接。



把所有依赖库打入可执行文件,体积大但移植性好。
gcc main.c -static -o app



(解释:生成不依赖系统动态库的独立程序)
-nostdlibno std lib不连接标准库。



不使用 glibc,用于编写 Bootloader 或裸机程序。
gcc -nostdlib start.o ...



(解释:仅链接指定文件,不引入标准 C 库)

🐰 兔哥划重点

1.-I,-L,-l傻傻分不清楚?

这是新手最容易报错的地方。记住这个口诀:

  • 头文件 (Include)找不到? 用-I(大写 i) 指路。

  • 库文件 (Lib)在哪? 用-L(大写 L) 指路。

  • 叫什么 (library)名字? 用-l(小写 L) 点名。

注意:-l后面跟的是库的缩写。

  • 文件名:libmath.so-> 选项:-lmath

  • 文件名:libjpeg.a-> 选项:-ljpeg

2.-c和-o的黄金搭档

在编写Makefile时,我们通常不会直接gcc main.c -o app一步到位,而是分两步走,这样修改一个文件时,只需要重新编译那个文件即可,速度更快:

# 1. 先生成 .o (使用 -c) gcc -c main.c -o main.o gcc -c func.c -o func.o # 2. 最后链接 (不加 -c) gcc main.o func.o -o app

3.-g和-O2能共存吗?

可以!-g主要是添加符号表,-O2是改变代码结构以优化性能。虽然可以共存,但在-O2优化后,GDB 调试时可能会发现代码跳跃执行(因为指令被重排了),建议开发阶段用-O0 -g,发布阶段用-O2。

如果觉得这篇速查表对你有帮助,欢迎点赞收藏,我是嵌入式兔哥,我们下期见!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 5:44:39

dubbo源码之一次RPC请求的生死之旅(基于Dubbo 2.7.8)

1. 全景图:从宏观到微观在钻入代码之前,我们需要先在脑海中建立一张全景图。一次同步的 RPC 调用,大致可以分为三个阶段:消费端(Consumer): 动态代理 -> 负载均衡 -> 封装请求 -> 编码…

作者头像 李华
网站建设 2026/11/4 1:08:34

基于SpringBoot+Vue的web城乡居民基本医疗信息管理系统管理系统设计与实现【Java+MySQL+MyBatis完整源码】

摘要 随着我国城乡居民基本医疗保险制度的不断完善,医疗信息管理系统的需求日益增长。传统的医疗信息管理方式存在效率低下、数据分散、安全性不足等问题,难以满足现代医疗服务的需求。城乡居民基本医疗信息管理系统的设计与实现,旨在通过信息…

作者头像 李华
网站建设 2026/11/4 2:31:35

【完整源码+数据集+部署教程】手势与标志识别检测系统源码[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

一、背景意义 随着人工智能技术的迅猛发展,计算机视觉领域的研究逐渐成为了学术界和工业界的热点。手势与标志识别作为计算机视觉的重要应用之一,具有广泛的应用前景,尤其是在智能交互、辅助驾驶、智能家居和人机交互等领域。手势和标志不仅…

作者头像 李华
网站建设 2026/11/3 15:24:42

03.统计学机器学习

统计学机器学习 简介:什么是机器学习中的统计思维? 在当今的生成式 AI 时代,我们看到从业者构建机器学习 (ML) 模型,从简单的回归到复杂而精密的神经网络和生成式大型语言模型 (LLM)。我们还看到数据科学和数据分析被广泛用于预测客户流失、推荐系统和其他用例。然而,尽管…

作者头像 李华
网站建设 2026/11/4 5:09:50

[Poi2011]Lightning Conductor题解

P3515 [POI 2011] Lightning Conductor 题目描述 逐渐变化的气候迫使 Byteburg 当局建造一个巨大的避雷针,以保护城市内的所有建筑物。 这些建筑物沿着一条街道排成一行,编号从 111 到 nnn。 建筑物和避雷针的高度是非负整数。 Byteburg 的资金有限…

作者头像 李华