GCC编译器入门:从源码到可执行文件的完整构建流程
创始人
2026-09-21 20:02:47

GCC(GNU Compiler Collection)是Linux世界里最重要的编译工具,几乎所有开源软件都是用GCC编译出来的。它最早只能编译C语言,现在已经支持C++、Objective-C、Fortran、Ada、Go等十几种语言。很多刚接触Linux开发的同学对GCC的编译流程一知半解,只知道敲个gcc main.c -o main,中间发生了什么完全不明白。今天就把GCC的完整构建流程拆解开来说。

一个C源文件从你写完到变成可执行文件,中间要经过四个步骤:预处理、编译、汇编、链接。GCC可以一条命令搞定全部四个步骤,也可以加参数把每个步骤拆开来观察。这四个步骤的产物分别是.i(预处理后的源码)、.s(汇编代码)、.o(目标文件)、最终的可执行文件。

第一步是预处理。GCC -E参数可以只跑预处理,输出结果到.i文件。预处理做什么呢?把#include包含的头文件内容全部展开(相当于把.h文件的内容直接复制到.c文件里)、处理#define宏替换、去掉//和/* */注释、处理#ifdef条件编译。比如你在代码里写了#define PI 3.1415926,预处理之后所有PI都被替换成了3.1415926。用-E参数能看到展开后的完整代码,排查宏展开相关的bug特别有用。

第二步是编译。GCC -S参数把预处理后的代码编译成汇编代码(.s文件)。这个阶段做的事情是语法分析、词法分析、语义分析、中间代码生成、优化、目标代码生成。编译是整个流程里最核心也最耗时的一步,GCC的各种优化选项(-O0、-O1、-O2、-O3)就是在这里生效的。汇编代码的人类可读性还不错,想知道一段C代码在CPU上变成了什么指令,加-S参数就行。

第三步是汇编。GCC -c参数把.s汇编文件变成.o目标文件。这一步用的是as汇编器,把汇编指令翻译成机器码。目标文件里已经包含了CPU能直接执行的机器指令,但这还不是完整的可执行文件——它可能引用了其他模块里的符号(比如printf),自己也还没分配确切的内存地址。

第四步是链接。这一步用ld链接器,把一个或多个.o目标文件以及需要的库文件(静态库.a或动态库.so)链接在一起,生成最终的可执行文件。链接分静态链接和动态链接:静态链接把库的代码直接复制到可执行文件里,文件体积大但运行时不依赖外部库;动态链接只记录库的位置,运行时由动态链接器加载到内存,文件小但依赖运行环境里有对应的库。GCC默认是动态链接,-static参数可以指定静态链接。

最常用的GCC参数有哪些?-o 指定输出文件名;-Wall 打开警告信息(强烈建议开,很多隐藏bug会被警告提示出来);-O2 或 -O3 开启优化;-g 生成调试信息(配合gdb调试用);-I 指定头文件搜索路径;-L 指定库文件搜索路径;-l 指定要链接的库(比如-lpthread链接线程库);-std=c99 或 -std=c11 指定C语言标准版本;-D 命令行定义宏(比如-DDEBUG)。

多文件项目怎么编译?最简单的方式是gcc main.c func.c util.c -o myprog,一次把所有源文件都编译了。但文件多了之后每次全量编译太慢,而且改一个文件重编全部也没效率。这时候就要用Makefile——把编译规则写在Makefile里,make工具会比较源文件和目标文件的时间戳,只重编修改过的文件。GCC配合Makefile是Linux C开发的标准工作流。

交叉编译是GCC的强项。用gcc编译出来的程序只能在同架构的机器上跑(比如x86上编的程序不能直接在ARM开发板上跑),但GCC支持交叉编译——在一台机器上编出另一台机器(比如ARM、MIPS)能执行的程序。嵌入式开发几乎都用交叉编译,因为目标平台资源有限装不了完整的编译环境。交叉编译需要安装对应的交叉编译器,比如arm-linux-gnueabihf-gcc。

常见的GCC报错有哪些?"undefined reference"错误是链接阶段找不到符号,通常是忘记链接某个库或者函数名拼写错了。"No such file or directory"是编译阶段找不到头文件或源文件,检查include路径和-I参数。隐式声明警告说明代码里调用了没有声明的函数,通常是忘记include对应的头文件。这些错误信息看懂了,排查起来很快。

最后提一个小技巧:用-pg参数编译程序,运行后会生成gmon.out文件,配合gprof工具可以分析程序的性能瓶颈——哪个函数被调用了多少次、占用了多少CPU时间。这是性能分析的入门工具,虽然简单但非常实用。GCC的强大之处在于它不仅能编译,还提供了丰富的工具链辅助开发调试,把这些用熟练了,C/C++开发的效率会提高很多。

⚠️
本网站信息内容及素材来源于网络采集或用户发布,如涉及侵权,请及时联系我们,发送链接至2697952338@QQ.COM,我们将第一时间进行核实与删除处理。

相关内容

热门资讯

剩菜放凉再进冰箱是误区:剩菜储... 一、很多人做错的储存习惯不少家庭吃完饭后,习惯把剩菜留在锅里或桌上,等它彻底凉透了再放进冰箱,理由是...
周末狂睡到中午是在补觉还是伤身... 一、周末补觉为什么让人越睡越累不少上班族工作日熬夜缺觉,一到周末就关掉闹钟,一口气睡到中午,觉得这样...
ZigBee组网实战:从节点配... ZigBee组网这事说起来不难,但真到自己动手的时候,坑还是不少的。很多人以为买了几个ZigBee模...
GCC编译器入门:从源码到可执... GCC(GNU Compiler Collection)是Linux世界里最重要的编译工具,几乎所有...
100M宽带下载只有6MB/s... 很多人办了100兆的宽带套餐,下载东西却只有5-6MB/s,觉得运营商骗人。但仔细想想,100兆(M...
流感不是普通感冒扛一扛就好:识... 一、流感和普通感冒不是一种病秋风起,嗓子疼、发烧、浑身酸的人多起来,不少人把流感当成普通感冒,觉得扛...
水果发霉切掉坏的还能吃吗:毒素... 一、这个常见做法其实不安全不少人本着不浪费的原则,看到水果局部发霉,就把坏的部分削掉继续吃,觉得剩下...
手足口病秋季高发期:五岁以下儿... 一、手足口病迎来秋季小高峰手足口病是由多种肠道病毒引起的常见传染病,最常见的是柯萨奇病毒A16型和肠...
入侵检测系统IDS:从特征匹配... 防火墙是网络安全的第一道防线,相当于大门上的锁——不是你门牌号上写的人不让进。但如果黑客绕过了防火墙...
每天一万步才健康?步数真相、膝... 打开手机的步数排行榜,很多人把一万步当成每天必须完成的"任务",走不够就绕着小区再补几圈。但这个被当...
拖地后总有腥臭味不是地没拖干净... 地板刚拖完,屋里却飘着一股鱼腥味、土腥味,反复拖也散不掉,这时该检查的往往不是地面,而是那把拖把。多...
业务员虚假承诺服务费能退回吗?... 业务员虚假承诺服务费能退回吗?海能误导性宣传欺骗股友!成功退款流程公布!“交了两万六的投顾服务费,换...
和讯投资误导性宣传!专业协助快... 和讯投资退款流程公布!误导性宣传!别再当冤大头!怎么退还服务费?会员费是可以退的!股民交会员费根本就...
海能投顾买入即亏’的垃圾股,这... 海能投顾买入即亏’的垃圾股,这钱还能要回来吗?老师一对一荐股真相曝光,服务费能退!“交了两万六的投顾...
慧研智投退款流程公布!退款方法... 慧研智投退款流程公布!退款方法让你省时又省心!老师一对一荐股真相曝光,服务费能退!您是否在慧研智投遭...
服务费能退回吗?杭州高能退费不... 服务费能退回吗?杭州高能退费不再难!退款方法让你省时又省心! 在跟高能智投有限公司合作后,作为高能智...
湖南金证投资服务费能退回吗?退... 湖南金证投资服务费能退回吗?退款方法让你省时又省心! 股市行情持续低迷,给人的感觉就像是一片乌云一直...
想退费看这里!退款方法让你省时... 想退费看这里!退款方法让你省时又省心!爱赢荐股只亏不赚!服务费能退!核心答案:符合条件可全额退回! ...
想退费看这里!爱赢投顾交了十几... 想退费看这里!爱赢投顾交了十几万会员费能退吗?老师一对一荐股真相曝光,服务费能退!核心答案:符合条件...
误导性宣传欺骗股友!成功退款流... 误导性宣传欺骗股友!成功退款流程公布!亚.商投顾服务费怎么退?那些疯狂拉群洗脑的营销模式,浮夸的收益...
上海凯石证券真的能带你稳赚不赔... 上海凯石证券真的能带你稳赚不赔吗?老师一对一荐股真相曝光,服务费能退! 困扰股民的几个关于上海凯石...
汇正财经服务费能退吗?老师一对... 汇正财经服务费能退吗?老师一对一荐股真相曝光,服务费能退!退款方法让你省时又省心! 核心问题直击:汇...
九方智投成功退款流程公布!有法... 九方智投成功退款流程公布!有法可依维权可退!申请退款流程公布!误导性宣传欺骗股民已退费! 证券投资咨...
申请退款流程公布!十几万会员费... 申请退款流程公布!十几万会员费能退吗?海南港澳资讯老师不可信!成功退款流程公布!海南港澳资讯老师不可...
顶点财经退费不再难!退款方法让... 顶点财经服务费是可以退的。如果认为顶点财经存在违规操作或欺诈行为,可以通过有效的退款流程来中请退回服...