一、gcc和g++的区别?
通常情况下: gcc 是C语言的编译器; g++是C++的编译器。
对于后缀为.c的文件,gcc会单作其为C程序,g++会当做为C++程序。
对于后缀为.cpp的文件,gcc和g++都会将其当做为C++程序。
编译阶段,g++会调用gcc,但是gcc不会自动调用g++。
C++代码中,如果想让某些函数用C编译,可以使用external“C”{函数},使用g++编译。
综上,很多人全部都用g++来编译。
二、文件是如何编译的?
从一个.cpp文件到可执行文件.exe,g++编译器中的实现大致也分为四个步骤:
1.、预处理(Preprocessing)
g++ -E main.cpp > main.i
这一步主要进行宏(#define)的替换,删除注释,插入#include的头文件等操作,生成的文件后缀名.i
2、编译(Compilation)
g++ -S mian.i
预处理之后变得简洁得代码文件,翻译成汇编语言,文件后缀为.s
3、汇编(Assembly)
g++ -c main.s
将汇编语言文件翻译成机器代码的二进制文件,文件后缀名为.o
4、链接(linking)
g++ main.o -o main
引入代码中使用到的库文件,生成可执行文件。
这里的-o 命令是指定可执行文件名。
到这里所有的编译已经结束。
三、编译动态库和静态库
大型项目中不可能使用一个单独的可执行程序提供服务,必须将程序的某些模块编译成动态或者静态库。
(1)静态编译
链接阶段,会将编译生成的目标文件.o与引用的库一起链接打包到可执行文件中。
优点:
程序运行速度较快
不依赖其他库执行,移植较为方便
缺点:
编译库与主程序,一起打包至程序中,会导致可执行程序体积较大。
更新不方便,需要重新编译
如果库被多个应用程序使用,多次装载会浪费内存。
(2)动态编译
程序运行时才被载入,解决了静态库对程序的更新、部署和发布带来的麻烦。用户只需要更新动态库即可。
优点:
多个应用程序可以使用同一个动态库。
缺点:
运行时加载,影响运行性能。
动态库缺失会导致文件无法运行。