本文主要是介绍GUN编译器(gcc/g++)- 编译过程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
说明
gcc test.c -o test
g++ test.cpp -o test
- 如上,可以很简单的使用一条命令将源码编译成可执行文件,但是实际上编译过程是一个比较复杂的工作,gcc/g++只是编译系统的入口程序,解析用户输入的参数,顺序调用预处理器(cpp)、编译器(ccl/cclplus)、汇编器(as)、链接器(ld),完成以下四个编译过程,生成可执行文件。
- 预编译
- 编译
- 汇编
- 链接
编译过程
预编译(Prepressing)
- 对代码进行预处理(即编译前的处理),执行源码中的预处理指令,例如:文件导入(#include),宏定义展开(#define)等,输出结果是C代码。
编译(Compilation)
- 将预编译产生的代码文件转化为汇编代码,输出结果是汇编代码。
汇编(Assembly)
- 将编译产生的汇编代码进行汇编编译,输出的二进制的目标文件.o。
链接(Linking)
- 将汇编编译产生的.o文件,链接成可执行程序文件(.out)。
使用
灵活
- 使用gcc/g++编译非常灵活
- 可以从源码开始到任何一个步骤停止(-o 可以将输出结果输出到文件),例如:
gcc -E test.c -o test_new.i // -E: 执行完预编译, 输出预编译结果
gcc -S test.c -o test.s // -S: 执行完编译,输出汇编代码
gcc -c test.c -o test.o // -c: 执行完汇编,输出目标文件
gcc test.c -o test // 执行完所有过程,输出可执行文件
- 也可以从编译过程的任何一个步骤继续编译,任意一个步骤停止,例如:
* 从预处理开始
gcc -E test.c -o test.i
gcc -S test.i -o test.s //将预处理后的代码编译成汇编代码
gcc -c test.i -o test.o //将预处理后的代码编译成目标文件
gcc test.i -o test //将预处理后的代码编译成可执行文件
* 从汇编开始
gcc -S source_file.c -o source_file.s // 编译成汇编代码 source_file.s
gcc source_file.s -o source_file // 将汇编代码编译成可执行程序
gcc -c source_file.s -o source_file.o //将汇编代码编译成目标文件(.o)
* 从目标文件(.o)开始
gcc -c source_file.c -o source_file.o // 编译成目标文件 source_file.o
gcc source_file.o -o source_file // 将目标文件链接成可执行程序
强大
- gcc/g++不仅仅是一个C/C++编译器,也可以完成汇编器(as)和链接器(ld)的工作。
- 汇编和链接工作,也可以使用as和ld来实现,但是需要手动加很多参数,使用gcc就简单很多。
汇编器
- 将汇编代码编译成可执行程序
gcc source_file.s -o source_file //将汇编代码,编译成可执行程序,如果汇编代码中没有main函数会提示,可先编译成.o文件
- 将汇编代码编译成.o文件
gcc -c source_file.s -o source_file.o //将汇编代码,编译成.o文件
链接器
- 链接成可执行程序
gcc source_file.o xxx.o -o source_file //将.o文件链接成可执行文件,
- .o 文件可以从.c编译而成,也可以从汇编代码(.s)编译而成。
这篇关于GUN编译器(gcc/g++)- 编译过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!