gcc的编译过程分为四个步骤,分别为:
1、预处理(Pre-Process)
在预处理阶段,编译器将头文件编译进来,完成这一步后程序从.c变为.i文件(需要注意的是这一步加入头文件只是把头文件件展开插入到程序中去)
2、编译(Compiling)
在这个阶段中,编译器会检查程序的规范性,是否有语法错误等。到这一步程序从.i文件变为.s文件
3、汇编(Assembing)
这个阶段是把.s文件转换成目标文件即.o文件
4、链接(Linking);
在成功编译后,就进入了链接阶段,这里有个概念:函数库
函数库中有很多编译器的库中已经帮我们实现了的函数,我们在程序中可以直接调用,例如printf()等,这些库函数和头文件的关系时,我们在预处理阶段包含进去的头文件中只有库函数的声明,而没有库函数的定义,那么这些库函数是在哪实现的呢,答案是系统把这些库函数的实现都放在了名为libc.so.6的库文件中,在没有指定路径的情况下,编译器会到/usr/lib中去找。这样就实现了printf()
库函数一般分为两种,一种是静态库,一种是动态库。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时就不需要库文件了,其后缀名为.a。而动态库是指程序在执行时有运行时链接文件加载库,这样可以节省系统的开销,动态库一般的后缀名为.so。gcc编译器默认使用的是动态库。
另外,在inclide语句中,“<>”表示在标准路径中搜索,而“”表示在本目录中搜索,