gcc and g++的區別

gcc和g++的區別

gcc和g++都是GNU(組織)的一個編譯器。首先GCC表示GNU Compiler Collections,gcc則表示編譯器。g++指GNU C++也是GCC的一部分。

gcc和g++背後都是運行gcc
           命令行下輸入gcc或g++,背後都是運行gcc編譯器對源代碼進行編譯和各種處理;因此這兩個命令其實是一樣的,只是對gcc編譯器的默認配置選項不同而已。

gcc和g++的不同配置體現在:
           g++對.c和.cpp文件都當做C++源代碼;而gcc把.c文件看做C源代碼,.cpp看做是C++源代碼;g++在鏈接步驟會自動和C++標準庫libstdc++鏈接;而如使用gcc編譯連接.cpp的C++程序,它不會自動鏈接C++標準庫,需要指定選項完成,如:gcc -lstdc++ hello.cpp。因此對於同一個C++源程序test.cpp,使用g++爲g++ hello.cpp,使用gcc則需要gcc -lstdc++ hello.cpp

因此:對於C源代碼建議使用gcc進行編譯,因爲默認的配置更適合C語言;對於C++源代碼,建議使用g++進行編譯。

首先編寫一個經典C++程序hello.cpp,Hello,world!爲例:

#include<iostream>
using namespace std;
int main(void)
{
	cout<<"hello world"<<endl;
	return 0;
}

[redhat@bogon ~]$ gcc hello.cpp  //編譯不通過

[redhat@bogon ~]$ g++ hello.cpp //成功執行 或者 [redhat@bogon ~]$ gcc -lstdc++ hello.cpp
[redhat@bogon ~]$ ./a.out
hello world!

再來編寫一個hello.c程序:

#include<stdio.h>
int main(void)
{
        printf("welcome to linux world\n");
        return 0;
}

[redhat@bogon ~]$ gcc hello.c
[redhat@bogon ~]$ ./a.out
welcome to linux world
[redhat@bogon ~]$ g++ hello.c -o hell
[redhat@bogon ~]$ ./hell
welcome to linux world

由此可見,後綴 .c  and .cpp都可以用g++來編譯,但gcc只能編譯後綴.c的文件。

gcc and g++ 分別是GNU的C & C++ 編譯器,gcc  and g++工作原理:

1.預處理,生成.i的文件[預處理器cpp]
2.將預處理後的文件不轉換成彙編語言,生成文件.s[編譯器egcs]
3.有彙編變爲目標代碼(機器代碼)生成.o的文件[彙編器as]
4.連接目標代碼,生成可執行程序[鏈接器ld]

兩者都可以編譯C和C++代碼,但是請注意:
(1)後綴爲.c的,GCC把它當作是C程序,而g++當作是c++程序;後綴爲.cpp的,兩者都會認爲是c++程序,注意,雖然c++是c的超集,但是兩者對語法的要求是有區別的。C++的語法規則更加嚴謹一些。

(2)編譯階段,g++會調用GCC,對於c++代碼,兩者是等價的,但是因爲GCC命令不能自動和C++程序使用的庫聯接,所以通常用g++來完成鏈接,爲了統一起見,乾脆編譯/鏈接統統用g++了,這就給人一種錯覺,好像cpp程序只能用g++似的。

(3)對於__cplusplus宏,實際上,這個宏只是標誌着編譯器將會把代碼按C還是C++語法來解釋,如上所述,如果後綴爲.c,並且採用GCC編譯器,則該宏就是未定義的,否則,就是已定義。

(4)編譯可以用GCC/g++,而鏈接可以用g++或者GCC -lstdc++。因爲GCC命令不能自動和C++程序使用的庫聯接,所以通常使用g++來完成聯接。但在編譯階段,g++會自動調用GCC,二者等價。

 

 



 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章