1.编译过程
我们可以直接用gcc对文件完成编译,也可以进行分步编译,分步编译的过程为预处理,编译,汇编,链接;
1.1直接编译
1.2预处理
预处理的功能:宏定义替换,文件包含,条件编译,去注释等
gcc是如何找到对应的库的呢?
在安装gcc编译器的时候,同时会进行一些库的安装,编译器自身有能力去查找所需要的库;
1.3编译
gcc检查代码的规范性,是否有语法错误等,以及确定代码的实际要做的工作,检查无误后,gcc将代码翻译成汇编语言,生成.s文件;
1.4汇编
汇编阶段是将编译生成的.s文件转换为目标文件(.o文件),相当于windows中的obj文件,生成机器可识别的二进制目标代码;
1.5链接
将汇编之后生成的.o文件进行链接,生成可执行程序
为什么需要链接?
因为我们的程序之中调用了函数接口,因此需要链接函数库;
1.5其它命令
-shared:尽量使用动态库进行编译,生成的文件会比较小但是需要系统具有动态库
-O0
-O1
-O2
-O3 编译器的4个优化选项,-O0没有优化,-O1为系统缺省,-O3优化级别最高,优化类似windows下的Release版本
-w:对语法检测宽松,不生成任何警告信息
-Wall:对语法检测严格,生成所有警告信息
2.函数库
2.1什么是函数库
由上述可知,我们在预处理阶段只是将头文件“stdio.h”进行了包含,并且头文件中只有printf函数的声明,并没有实现,那么是在哪里实现函数的呢?
系统将这些函数的实现都放到了名为libc.so.6的库文件中去了,在没有特别指定的时候,gcc会到系统默认的搜索路径/usr/lib下进行查找,也就是链接到libc.so.6库函数中去,这样就实现了函数,这也是链接的作用;
2.2动静态库的差别
3.g++编译器
程序的编译过程并不是由编译器决定的,因此用任何编译器的编译过程都是预处理,编译,汇编,链接,g++编译器的选项和gcc都是一样的;