一个C程序的编译过程(Linux环境下Gcc)
2011-06-14 17:03
477 查看
一 以下是C程序一般的编译过程:
从图中看到:
将编写的一个c程序(源代码
)转换成可以在硬件上运行的程序(可执行代码
),需要进行编译阶段 和链接这两个阶段。
其中,
1. 编译阶段先通过“编译器
“把一个 .c / .cpp 源代码
编译成 .s的汇编代码
;再经过“汇编器
” 把这 个.s的汇编代码汇编成 .o 的 目标代码
2. “连接器
“ 通过连接其他 .o 代码(如果需要的话) 库文件 和 1 中的.o 目标代码生成可执行文件
该文件流被这三种程序(红色)的加工,分别表现出四种形式(蓝色) ,这就是c程序的编译和链接过程。如果再详细的话,编译器在将源文件编译成汇编文件的过程又分为:预处理阶段(生成 .i代码
) 和 优化阶段
二、C编程中的文件后缀名介绍
.c 未经过预处理的C源码
.h C头文件
.i 经过预处理的C源码
.s 生成的汇编语言代码
.o 编译之后产生的目标文件
解释:*.c一般使我们自己编辑的代码,使我们劳动的结晶;*.h一般是我们手工生成的接口文件,如果愿意,也可在*.c完成后用GCC的选项-aux-info帮我们生成;*.i是经过预处理后的源码,是由GCC在选项-E编译下自动生成的文件;*.o是编译后产生的目标文件;*.s是GCC在选项-S编译下生成的汇编语言代码,对于性能要求很高的程序可以先生成汇编语言文件并对汇编做优化,然后用优化后的汇编生成目标文件并链接
三
演示 hello.c
的编译
过程(Linux 下 Gcc)
本小节的演示都针对文件 hello.c 进行
1. /*
2. * hello.c
3. */
4.
5. #include <stdio.h>
6. int main()
7. {
8. printf("
Better goal, Better life!
/n");
9. return 0;
10. }
1.生成预处理后的文件 hello.i
$
gcc -E hello.c -o hello.i
2
.生成汇编语言文件 hello.s
$
gcc -s hello.i -o hello.s
3.生成目标文件 hello.o
$ gcc -c hello.i
$ gcc -c hello.s
4. 生成可执行文件
$ gcc -o hello hello.o
5. 运行及结果
$
./hello
Better goal, Better life!
当然也可以直接生成, $
gcc -c hello.c
就可以生成可执行文件。这是Gcc内部的事。但就算是跳跃也要经过一步步的翻译,
原理是相似的,万变不离其宗!
从图中看到:
将编写的一个c程序(源代码
)转换成可以在硬件上运行的程序(可执行代码
),需要进行编译阶段 和链接这两个阶段。
其中,
1. 编译阶段先通过“编译器
“把一个 .c / .cpp 源代码
编译成 .s的汇编代码
;再经过“汇编器
” 把这 个.s的汇编代码汇编成 .o 的 目标代码
2. “连接器
“ 通过连接其他 .o 代码(如果需要的话) 库文件 和 1 中的.o 目标代码生成可执行文件
该文件流被这三种程序(红色)的加工,分别表现出四种形式(蓝色) ,这就是c程序的编译和链接过程。如果再详细的话,编译器在将源文件编译成汇编文件的过程又分为:预处理阶段(生成 .i代码
) 和 优化阶段
二、C编程中的文件后缀名介绍
.c 未经过预处理的C源码
.h C头文件
.i 经过预处理的C源码
.s 生成的汇编语言代码
.o 编译之后产生的目标文件
解释:*.c一般使我们自己编辑的代码,使我们劳动的结晶;*.h一般是我们手工生成的接口文件,如果愿意,也可在*.c完成后用GCC的选项-aux-info帮我们生成;*.i是经过预处理后的源码,是由GCC在选项-E编译下自动生成的文件;*.o是编译后产生的目标文件;*.s是GCC在选项-S编译下生成的汇编语言代码,对于性能要求很高的程序可以先生成汇编语言文件并对汇编做优化,然后用优化后的汇编生成目标文件并链接
三
演示 hello.c
的编译
过程(Linux 下 Gcc)
本小节的演示都针对文件 hello.c 进行
1. /*
2. * hello.c
3. */
4.
5. #include <stdio.h>
6. int main()
7. {
8. printf("
Better goal, Better life!
/n");
9. return 0;
10. }
1.生成预处理后的文件 hello.i
$
gcc -E hello.c -o hello.i
2
.生成汇编语言文件 hello.s
$
gcc -s hello.i -o hello.s
3.生成目标文件 hello.o
$ gcc -c hello.i
$ gcc -c hello.s
4. 生成可执行文件
$ gcc -o hello hello.o
5. 运行及结果
$
./hello
Better goal, Better life!
当然也可以直接生成, $
gcc -c hello.c
就可以生成可执行文件。这是Gcc内部的事。但就算是跳跃也要经过一步步的翻译,
原理是相似的,万变不离其宗!
相关文章推荐
- 一个C程序的编译过程(Linux环境下Gcc)
- 一个C程序的编译过程(Linux环境下GCC)
- 1.2.在linux环境实践,使用vim编写一个程序,然后使用gcc查看【预处理】、【编译】、【汇编】、【链接】各阶段文件的内容。并熟悉相关指令。
- 【Linux】使用vim编写一个程序,gcc查看预处理、编译、汇编、链接过程
- 在linux环境下尝试使用gcc编译一个程序,并验证-E\-S\-c选项
- 在linux环境下尝试使用gcc编译一个程序,并验证-E\-S\-c选项
- ok6410[001] Ubuntu 16.04[64bit]嵌入式交叉编译环境arm-linux-gcc搭建过程图解
- Linux 环境下C编程指南-----gcc 编译的四大过程(预处理-编译-汇编-链接 )
- 64位Ubuntu 16.01搭建嵌入式交叉编译环境arm-linux-gcc过程图解
- Ubuntu 14.04 LTS嵌入式交叉编译环境arm-linux-gcc搭建过程图解
- linux下GCC编译环境中二叉树遍历、C语言实现以及调试过程中段错误
- Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解
- 在进行嵌入式开发之前,首先要建立一个交叉编译环境,这是一套编译器、连接器和libc库等组成的开发环境。文章通过一个具体的例子说明了这些嵌入式交叉编译开发工具的制作过程。 随着消费类电子产品的大量开发和应用和Linux操作系统的不断健壮和强大,嵌入式系统越来
- Ubuntu 16.04[64bit]嵌入式交叉编译环境arm-linux-gcc搭建过程图解
- linux下c程序编译过程及GCC,G++, GDB简介
- Ubuntu 16.04[64bit]嵌入式交叉编译环境arm-linux-gcc搭建过程图解
- <Linux>Linux对C程序的调试过程--gcc的编译过程
- 64位Ubuntu 16.04搭建嵌入式交叉编译环境arm-linux-gcc过程图解
- Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程
- Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解