gcc test.c -o test
,这一行命令就可以将test.c源代码生成可执行文件test,下面是拆解这个过程。总结这个变化过程为test.c 》 test.i 》 test.s 》 test.o 》 test
一、预编译(预处理)
1.将所有的#define删除,并展开所有的宏定义;
2.处理所有的预编译指令,例如:#if,#elif,#else,#endif;
3.处理#include预编译指令,将被包含的文件插入到预编译指令的位置;
4.添加行号信息文件名信息,便于调试;
5.删除所有的注释:// /**/;
6.保留所有的#pragma编译指令,因为在编写程序的时候,我们经常要用到#pragma指令来设定编译器的状态或者是指示编译器完成一些特定的动作。
包括(1)去注释 (2)宏替换 (3)头文件展开 (4)条件编译
gcc test.c -E -o test.i
生成.i文件。
二、编译:C语言——》汇编
1.扫描,语法分析,语义分析,源代码优化,目标代码生成,目标代码优化;
2.生成汇编代码;
3.汇总符号;
4.生成.s文件
gcc test.i -S -o test.s
生成.s文件
三、汇编:汇编——》二进制
1.根据汇编指令和特定平台,把汇编指令翻译成二进制形式;
2.合并各个section,合并符号表;
3.生成.o文件
gcc test.s -c -o test.o
生成.o文件
四、链接
1.合并各个.obj文件的section,合并符号表,进行符号解析;
2.符号地址重定位;
3.生成可执行文件
gcc test.o -o test
生成可执行文件test,当前文件夹下执行./test,即可运行程序。
gcc test1.o test2.o -o test
,即将两个.o文件链接在一起,生成可执行文件test。
直接一条命令搞定就是gcc test1.c test2.c -o test
以上内容参考自:https://blog.csdn.net/quinn0918/article/details/70024401
注意:
我们用gcc编译程序时,常常会用到“-I”(大写i)后接头文件地址,“-L”(大写l)后接链接库文件地址,“-l”(小写l)指定需链接的库文件等参数,下面做个记录:例:
gcc -o hello hello1.c hello2.c hello3.c -I/home/hello/include -L/home/hello/lib -lworld
这条命令运行后,会在当前文件夹下产生一个hello文件,这个文件就是可执行文件(类似windows的hello.exe),在当前文件执行命令./hello,即可运行该文件,也就是运行后面三个C源文件。-o即out指定输出文件名。
网友评论