gcc与g++编译器的程序文件分别为:/usr/bin/g++和/usr/bin/gcc。
gcc 和 GCC 是两个不同的东西,GCC:GNU Compiler Collection(GUN 编译器集合),它可以编译C、C++、JAV、Fortran、Pascal、Object-C、Ada等语言。gcc是GCC中的GUN C Compiler(C 编译器);g++是GCC中的GUN C++ Compiler(C++编译器)。
首先需要强调一点,gcc与g++都可以编译C和C++源程序,对于.c文件gcc当做c语言处理,g++当做c++处理;对于.cpp文件gcc和g++均当做c++处理。C++是C的超集,但是两者对语法的要求标准是不一样的,C++对语法的要求更加严格一些,更加规则。
在预处理阶段,gcc与g++对.c和.cpp产生的效果是一样的,即该阶段两者都可以正常进行。
在编译阶段,g++实质上是调用的是gcc,因此在编译阶段两者是一样的,但是gcc程序不能自动将c++程序使用的库文件进行链接。在此阶段虽然不需要对库文件进行链接,但是同样需要识别C++使用的库文件,从而对库文件进行申明,因此gcc在编译阶段直接编译C++程序会报错。而g++可以成功编译生成汇编语言代码。
在汇编阶段,都是利用as程序将汇编语言代码.s译为机器代码.o,因此也完全一样。
在链接阶段,gcc无法将C++程序生成的.o文件转化为可执行程序,因为gcc程序不能自动将c++程序使用的库文件进行链接,而g++可以正常进行。
因此,gcc与g++在执行C程序的过程中所做工作是一样的(g++调用了gcc来完成各项工作),都可以正常运行。gcc和g++的区别主要是在对cpp文件的编译和链接过程中,因为cpp和c文件中库文件的命名方式不同,g++既可以编译C又可以编译C++是因为g++在内部做了处理,默认编译C++程序,但如果遇到C程序,它会直接调用gcc去编译。
extern "C"对于gcc和g++的效果是一样的。extern "C"的主要作用就是为了能够正确实现C++代码调用其他C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。由于C++支持函数重载,因此编译器编译函数的过程中会将函数的参数类型也加到编译后的代码中,而不仅仅是函数名;而C语言并不支持函数重载,因此编译C语言代码的函数时不会带上函数的参数类型,一般之包括函数名。
但是为了能够是gcc能正常完成C++的编译,需要在编译和链接阶段采用- lstdc++参数,其余操作不变。g++的使用完全同gcc,只是不需要加- lstdc++参数,如: g++ -E hello.c -o hello.i g++ hello.cpp -o hello gcc -S -lstdc++ hello.ii -o hello.s(hello.ii是hello.cpp经过预处理产生的) gcc -lstdc++ hello.cpp -o hello