编译过程
1.预处理(不做语法检查)
会把include引入的库文件嵌入到当前c文件代码。
示例:
1.1创建文件 touch a.h,创建文件touch hello.c
1.2填入a.h内容
int a;
1.3 填入hello.c内容
#include "a.h"
int main (int argc,char *argv[]){
return 0;
}
1.4执行预处理命令 gcc -E hello.c -o hello.i
发现hello.i文件内容变为
int a;
int main (int argc,char *argv[]){
return 0;
}
2.编译(编译器根据上一步转为汇编指令代码,会语法检查)
gcc -S hello.i -o hello.s
3.汇编(根据汇编文件生成目标文件,是二进制的,无法运行该文件)
gcc -c hello.s -o hello.o
4.链接(把二进制的指令链接到各个动态库,生成可执行的二进制文件)可以执行ldd hello(windows上可以使用depends软件直接拖拽进入即可发现需要依赖的动态库dll文件)看到这个文件文件执行所需要的动态库,只要把dll动态库文件放在执行的文件同级就可以运行了
gcc hello.o -o hello_elf
system()和#include的区别
system("./helloworld");相当于java的直接调用api得到结果
#include "a.h"相当于java引入外部类,外部依赖,代码抽取出来的方法