C语言复习(1)
test.c
#include <stdio.h>
int main(){
printf("hello\n");
return 0;
}
1.预处理阶段
由于在test.c中使用了头文件,所以GCC在编译时首先要把头文件stdio.h中的内容加载到test.c的首部
gcc -E test.c -o test.i
E表明只进行预处理。o表明输出文件名。
2.编译阶段
词法分析:关键字、标识符等等是否正确;
语法分析:程序中语句的语法是否正确;
语义分析:语句的逻辑意义是否正确。
gcc -S test.i -o test.s
S表明只进行编译,生成一个汇编文件。
3.汇编阶段
将汇编程序翻译成CPU能识别的二进制文件,即目标文件。
gcc - c test.c -o test.o
c表明只进行汇编。
4.链接阶段
把程序中所有目标文件和所需的库文件都链接在一起
gcc -test.o -o test
补充:
函数库实现:
信息的打印函数,文件的打开或关闭函数,内存空间的申请与释放函数,数学计算函数。
PS:在面向对象语言中,函数被封装在类中,所以函数库就变成了类库。
函数库的使用方式分为静态链接和动态链接两种。
1)静态链接是指编译系统在链接阶段把程序的目标文件和所需的函数库文件链接在一起,这样生成的可执行文件就可以在没有函数库的情况下运行。就好比火箭把燃料和氧料装在一起,就可以在没有空气的太空中飞行。
2)动态链接是指编译系统在链接阶段并不把目标文件和函数库文件链接在一起,而是等到程序在运行过程中需要使用才链接函数库。
静态链接产生的可执行文件体积较大,但运行效率较高。而使用动态链接文件小,运行效率低低一点。
在具体应用时,如果有多个源文件都需要调用函数库,那么应该选择动态链接的方式。而只有少数源文件需要调用函数库时,应该选择静态链接的方式。可以被静态链接的函数库称为静态库,可以被动态链接的函数库成为动态库,或者共享库。
Glibc(GNU library C)是GNU推出的C语言函数库,符合ISO C和POSIX标准。
在linux系统中,Glibc分布在/lib和/usr/lib目录下,其中/lib目录中的函数库文件主要是给/bin目录下的系统程序使用的,/usr/lib目录中的函数库文件主要是给/usr目录下的用户程序使用的。
如下所示为/usr/lib目录下的部分png函数库文件:
libpng.a
libpng.la
libpng.so
libpng.so.3
libpng.so.3.16.0
后缀为a的是静态库文件,后缀为la的是用来记录库文件信息的动态库文件,后缀为so的是动态库文件