浅谈一下编译器g++和gcc之间的区别,和gcc经过几个阶段可以将源程序编译链接成可执行文件。
一、首先说明一点,g++和gcc都是GNU组织发布的编译器,两者存在不同,这里分成三中文件说明,一种扩展名为.c的文件,gcc会把他当成c程序来处理,而g++会把他当成c++程序处理;二种文件扩展名为.c++,两者都会当成C++程序处理;第三种文件扩展名为.cpp,在编译阶段,其实gcc和g++都是相同的,都使用的是gcc来进行处理,但是当进入链接阶段的时候,gcc无法自动链接C++的函数库,要想链接C++函数库,必须手动操作,命令为gcc
hello.cpp -lstdc++ -o
hello。而g++则会自动链接C++的函数库,为了方便起见,对于.cpp的文件就直接使用g++来进行编译和连接,省去了使用gcc进行编译的阶段,从而使得有些人感觉对于.cpp文件的处理么有gcc什么事儿,其实不然,编译阶段g++还是使用了gcc进行编译。
二、再来解释一下gcc是经过几个阶段完成编译链接生成可执行文件的。
以简单的hello.c程序为例来解释该问题,
#include
int main(int argc,char *argv)
{
printf("hello\n");
return 0;
}
1、预处理阶段
一段程序中通常会包含宏定义和头文件包含,预处理阶段就是对这两者进行处理,同时包括了语法检查,该阶段的命令为gcc -E
hello.c -o hello.i
生成一个hello.i文件。文件hello.i文件特别大,是因为程序将头文件进行了替换,导致文件大的现象,所以在实际编程过程中,如果用不到的头文件就不需要包含在程序中,否则会造成时间和空间的浪费。
2、生成汇编文件
对预处理文件进行汇编生成汇编文件,该命令为:gcc -S(大写) hello.i -o hello.s
3、由汇编文件生成目标文件(.o文件)
对汇编文件进一步进行处理,使每个源程序都会生成一个目标文件,扩展名为.o,该命令为
gcc -c hello.s -o hello.o
4、链接目标文件和库函数文件,生成可执行文件
在链接阶段,需要将目标文件和库函数文件相链接,这里包括静态库和动态库,生成最终的可执行文件。该命令为:gcc hello.o
-o hello
5、可以运行可执行文件hello
三、如何使用g++编译动态库\静态库?如何使用g++连接非标准库和应用程序?
什么是库呢?简单的说库就是一组已经写好了的函数和变量、是经过编译了的代码,为了提高开发的效率和运行的效率而设计的。库可以分为静态库和动态库(共享库)两类,在linux系统中静态库的扩展名为.a,动态库的扩展名是.so。静态库是在每个程序进行链接的时候将库在目标程序中进行一次拷贝,当目标程序生成的时候,程序可以脱离库文件单独运行,换言之原来的文件即使删除程序还是会正常工作。共享库可以被多个应用程序共享,实在程序运行的时候进行动态的加载,因此对于每个应用程序来说,即使不再使用某个共享库,也不应该将其删除,因为其他的引用程序可能需要这个库。