? ? ? ? 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??