一:什么是gcc编译器?
gcc(GUN Compiler Collection)是LINUX下最常用的c语言编译器,它是CUN项目中符合ANSI C标准的编译系统,能够编译用C,C++和Object C等语言编写的程序。GCC不仅功能非常强大,结构也异常灵活。最值得称道的一点就是它可以通过不同的前端模块来支持各种语言,如Java,Fortran,Pascal,Modula-3和Ada等。开放,自由和灵活是LINUX的魅力所在,而这一点在GCC上的体现就是程序员通过它能够更好地控制整个编译过程。
二:gcc是交叉编译器,即在一个平台编译可在另一个平台运行,要实现交叉编译,先要装交叉编译器。
三:gcc的编译过程是什么?
1.预处理(-E)生成 .i文件
(1)头文件展开(2)宏替换(3)条件编译
(2)编译(-S)生成 .s文件
把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件
(3)汇编(-c)生成 .o文件,即目标文件
将汇编代码转变成机器可以执行的命令
(4)链接(-O)
链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件
编译器优化 -O1,-O2,-O3
四:GCC的三级优化分别做了什么?五:
-O1:编译会尝试减少代码体积和代码运行时间。但是并不执行会花费大量时间的优化操作
-O2:进一步优化.GCC执行几乎所有支持的操作但不包括空间和速度之间权衡的优化。-O2优化等级下,并不执行循环展开和函数“内联”优化操作。与-O1比较该优化-O2将会花费更多的编译时间当然也会生成性能更好的代码
-O3:更进一步优化。-O3打开-O2指定的所有优化操作并且打开:-finline-functions,-funswitch-loops,-fgcse-after-reload
-Os:针对程序空间大小优化(多用于嵌入式系统)。-Os使能-O2中除去会增加程序空间的所有优化参数。同时-Os还会执行更加优化程序空间的选项
静态库:是在执行程序之前就已经加入到执行代码中,成为执行程序的一部分来执行的,后缀名:.a
动态库:是在执行程序启动时加载到执行代码中,后缀名:.so
1,两者的执行时间不同:静态库:是在执行程序之前,动态库:是在执行程序启动时。
2,执行速度方面:静态库比动态库快,因为静态库在执行程序之前就已经加入到执行代码中,而动态库是在执行程序启动时才加载到执行代码中的。
3编译速度方面:动态库执行速度快。
4,静态库生成的代码,可执行文件较大,动态库相对较小。
5,静态库不易升级,而动态库易升级。
6在代码部署方面:动态库不易部署,而静态库易部署。
八:该怎样选择静态库与动态库?
1,在升级角度:若需要频繁升级,则选择动态库,反之,选静态库。
2,在代码的部署方面:若对代码部署有细致要求,则选择静态库,反之,选动态库。
3,在代码大小方面:若要求体积较小,则选择动态库,反之,选静态库。
创建:1.gcc -c 源文件.c 将.c文件变成.o 文件
2.ar rcs 静态库名 目标文件1 目标文件2
注意事项:1 rc :静态库不存在,就创建该库文件
2 s:更新库文件
3 例如:libadd.a lib是前缀,.a是后缀
4 目标文件是.o文件
使用: gcc main.c -ladd -L. 说明: -l表示链接 -L. 指定库的路径, .表示当前路径 add是库名
十:动态库的创建与使用
创建:gcc -shared -fPIC -o 库名.so 源文件.c
例如:gcc -shared -fPIC -o libcal.so add.c sub.c
使用:gcc 源文件.c ./库名.so -o可执行文件名
例如: gcc main.c ./libcal.so -o main