gcc编译过程

本文详细介绍了gcc编译过程,包括预处理、编译、汇编和链接四个步骤,以及常用的编译选项。特别提到了在不同架构(如x86和ARM)下的编译工具使用和跨平台编译的注意事项。
摘要由CSDN通过智能技术生成

目录

gcc编译过程

gcc的编译过程

预处理

编译

汇编

链接

常用的编译选项

补充


gcc编译过程

在进行嵌入式开发的过程中,源文件需要经过编译才能生成可执行文件。
在Windows系统下进行开发时,由于各种集成开发软件的存在,我们只需要点几个按钮即可完成程序的编译流程,这是因为我们使用的各种集成开发环境(比如keil软件)已经将各种编译工具的使用封装好了。
Linux下也有很优秀的集成开发工具,但是更多的时候是直接使用编译工具;即使使用集成开发工具,也需要掌握一些编译选项。
PC机上的编译工具链为 gcc、ld、objcopy、objdump等,它们编译出来的程序是在x86平台上运行的。要编译出能在ARM平台上运行的程序,必须要使用交叉编译工具 xxx-gcc、xxx-ld 等(不同版本的编译器的前缀不一样,比如arm-linux-gcc),下面分别介绍。

gcc的编译过程

一个C/C++文件要经过预处理(preprocessing)、编译(compilation)、汇编(assembly)和链接(linking)这4步才能变成可执行文件。以编译x86架构下的hello.c程序为例:
预处理: gcc -E -o hello.i hello.c
编译:   gcc -S -o hello.s hello.i
汇编:   gcc -c -o hello.s hello.o
链接:   gcc -o hello hello.o
我们通常使用'编译'统称以上的四个步骤。   

预处理

预处理过程是使用gcc -E编译选项将.c文件处理为.i文件。
这里简要介绍下预处理过程所做的一些操作:
1、将源文件中包含的头文件展开。
2、删除源文件中所有的注释信息。
3、完成宏定义替换。
4、处理所有的预编译指令如#if、#else、#endif等等。
5、保留#pragma编译指令。
6、添加行号、文件名用于后续调试。
7、生成.i文件。

编译

编译过程是使用gcc -S编译选项将.i文件编译为.s汇编文件。
编译过程所做的一般操作如下:
1、源代码分析、语法分析、目标代码生成、目标代码优化等等。
2、生成汇编代码。
3、汇总符号。
4、最后生成.s汇编文件。

汇编

汇编过程是使用gcc -c编译选项将.s汇编文件转化为.o目标文件。
汇编过程所做的一般操作如下:
1、根据各种平台汇编指令的不同,将汇编指令翻译为二进制形式。
2、合并各个部分,合并符号表。
3、生成.o目标文件。

链接

链接过程是将.o目标文件转化为最后的可执行文件。
链接过程所做的一般操作如下:
1、如果有多个.o文件进行链接就合并多个.o文件,合并符号表,进行符号解析。
2、符号地址重定位。
3、生成可执行文件。

常用的编译选项

常用编译选项描述
-E预处理。
-c预处理、编译、汇编但是不进行链接操作。
-o指定输出的文件
-I(大写i)指定头文件的目录
-L指定链接时库文件的目录
-l(小写L)指定链接哪个库文件

补充

编译多个文件时和编译单个文件的步骤一样,可以分别将每一个.c源文件编译为.o文件后,最后使用gcc将所有的.o文件链接生成可执行文件。
以上的操作都是在x86架构下使用gcc编译器进行操作的,如果编译的程序是在ARM平台下运行的,则需要使用交叉编译器进行编译,如arm-linux-gnueabihf-gcc、aarch64-linux-gnu-gcc等交叉编译工具,对源文件的处理流程和在x86架构下的一样。
  • 26
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

牧以南歌〆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值