1.gcc编译流程
对于基于ARM内核的微处理器移植操作系统,不可避免要使用交叉编译。交叉编译指不同操作系统平台或不同处理器平台下的编译,比如windows下编译Linux系统源代码,X86平台下编译ARM源代码。
编译器的一般工作流程:
- 源代码编辑
- 源代码文件
预处理
- 对预处理文件
编译
- 对编译后的文件
汇编
- 对汇编后的文件
链接
- 执行文件
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 | 预处理文件 |
.m | Objective-C源代码文件 |
.o | 目标文件 |
.s | 汇编文件 |