gcc 编译流程/参数


1.gcc编译流程

对于基于ARM内核的微处理器移植操作系统,不可避免要使用交叉编译。交叉编译指不同操作系统平台或不同处理器平台下的编译,比如windows下编译Linux系统源代码,X86平台下编译ARM源代码。
编译器的一般工作流程:

  1. 源代码编辑
  2. 源代码文件预处理
  3. 对预处理文件编译
  4. 对编译后的文件汇编
  5. 对汇编后的文件链接
  6. 执行文件

2. gcc 编译选项常用参数(-E -S -c -o)

在编译C语言程序中,gcc是最常用的编译器,本文主要说明gcc中最重要,最基本的参数,知道这几个参数的作用,大多数场景下的编译任务我们都可以完成了。本文也借这几个参数,说明一段c语言代码是如何编译成为机器识别的代码的。

提示:以下是本篇文章正文内容,下面案例可供参考

2.1常用参数功能说明

本文主要说明-E,-S,-c,-o 四个编译选项,他们分别对应C语言程序编译中的几个步骤。

gcc 编译器一般格式:gcc【选项】【输入文件名】【-o 输出文件名】。

以编译程序hello.c为例

1.[-E ]预处理,主要是进行加粗样式宏定义展开等。生成预处理文件hello.i

gcc -E hello.c
或者gcc -E hello.c -o hello.i指定文件名

2.[-S ]编译,生成汇编代码。检查编程语言语法/语义/优化内容等,生成汇编文件hello.S

由源文件直接生成汇编文件:gcc -S hello.c
或者由预处理文件生成汇编文件并指定名称:gcc -S hello.i -o hello.s

3.[-c ]汇编:生成机器码。对于gcc编译器而言,它的汇编过程就是将编译形成的汇编文件转换为目标文件的过程,生成中间目标文件hello.o,这个中间目标文件不能直接执行,还需要链接。

由源文件直接生成中间目标文件:gcc -c hello.c
或者由汇编文件生成中间目标文件并指定名称gcc -S hello.c -o hello.s

4.[-o 输出文件名 ]链接: 链接器ld把中间目标文件和相应的库(包括静态链接库文件.a和动态链接库.so)链接为可执行文件。

直接由源文件生成目标文件:gcc hello.c (-o hello)
有中间目标文件生成目标文件并指定名称:gcc hello.o -o hello

我们需要注意,-o本质上是一个重命名选项。无论有没有-o选项,最后都会执行链接的步骤。
当不使用-o选项时,执行命令gcc hello.c,生成的是默认的hello.out文件。我们可以用-o重命名一下, 使用命令gcc hello.c -o hello,生成可执行的hello文件。

Tips:
1)静态库在链接阶段,会将汇编生成的中间目标文件.o与引用到的库一起链接打包到可执行文件中,因此生成的文件代码比较大。
2)动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入,节省系统开销。

5.[-O/O2]:对程序进行优化编译和链接,这样产生的可执行文件执行效率提高,但是编译和链接速度会变慢。-O2比-O更好地优化编译和链接,但更慢。

gcc -O2 hello.c -o O2hello

6.执行文件

./hello

3.gcc编译器常见文件类型

扩展名说明
.c源文件
.h头文件
.a档案库文件
.i预处理文件
.mObjective-C源代码文件
.o目标文件
.s汇编文件
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值