1.今天学习了gcc编译器,gcc编译器编译为四个过程,分别为预处理,编译,汇编,链接。以hello.c程序为例:
(1).预处理:对源程序中的伪指令(即以#开头的指令)和符号进行处理的过程。一般包括头文件展开,宏替换,条件编译。
执行命令:gcc -E hello.c > hello.i
经过预处理后可以得到hello.i的文件
在源代码前插入了stdio.h使整个程序变成937行。
(2)编译:将预处理完的文件进行语法检查,词法分析。
执行命令:gcc -c hello.c
经过编译可以得到hello.o目标文件
(3)汇编:将汇编代码转变成机器可以执行的命令,每一条汇编语句几乎都对应一条机器指令。
执行语句:gcc -S hello.c
经过汇编会生成hello.s的汇编文件
(4)链接:将各个目标文件组装在一起,生成可以执行的文件,并且文件名可以自己命名。
链接过程包括按序叠加,相似段合并,符号地址的确定,符号解析与重定位,指令的修正,全向构造与解析等等。
2.gcc的优化选项
(1)-O1优化:该模式下对于一个大的函数或功能会花费更多的时间和内存,编译会尝试减少代码体积和代码运行时间。但是并不执行会花费大量时间的优化操作。
(2)-O2优化:并不执行循环展开和函数“内联”优化操作,与-O1相比较-O2将会花费更多的编译时间,当然也会生成性能更好的代码。
(3)-O3优化:更进一步优化。-O3打开-O2指定的所有优化操作并且打开-finline-functions -funswitch_loops
-fgcse-after_relead优化项。
3.库:提供一些可以直接拿来用的变量函数,但是不能看到其具体的实现过程。库分为静态库和动态库两种。
(1)静态库:是在执行程序之前就已经加入到执行代码中,成为执行程序的一部分来执行,后缀名为 .a。
静态库会整合到程序中,这样会使我们的程序臃肿,体积较大,运行时比较占内存,编译效率低,而且不易升级,但是我们可以对其进行较好的布局,从而提高执行效率。
(2)动态库:是在执行程序启动时加载到执行代码中 后缀名为 .so。
动态库只有在使用它的程序执行时才会使用,这样就会使我们的程序轻便,运行时占用内存少,编译较快,而且容易升级,但是我们很难对其进行较好的布局,从而降低其执行效率。