首頁 > 軟體

Linux環境中gcc和g++的區別詳解

2020-06-16 16:43:24

Windows中我們常用vs來編譯編寫好的C和C++程式碼;vs把編輯器,編譯器和偵錯程式等工具都整合在這一款工具中,在Linux下我們能用什麼工具來編譯所編寫好的程式碼呢,其實Linux下這樣的工具有很多,但我們只介紹兩款常用的工具,它們分別是gcc和g++。

工具用法介紹

gcc和g++的用法都是一樣的,在這裡我們只介紹gcc:

上圖介紹了相關指令和引數以及該條指令所做的對應的事情。

  • gcc  -E  filename.c  -o  filename.i
  • 將c檔案轉化成C++檔案,這個過程也叫做預處理過程
  • gcc -S  filename.i  -o  filename.s
  • 將預處理過程生成的.i字尾的檔案轉化成組合檔案,裡面儲存的是相應的組合程式碼,這個過程叫做編譯。
  • gcc  -c  filename.s  -o  filename.o
  • 將組合檔案中的組合程式碼翻譯成相應的機器語言,這個過程叫做組合。
  • gcc  filename.o  -o  filename.exe
  • 這條指令是完成連結這個過程的,它通過連結器ld將執行程式的目標檔案和庫檔案連結在一起,生成最後的可執行檔案
  • 生成可執行檔案後,我們就能夠呼叫相應的程式了。

注意:由於g++和gcc的用法相同,所以在這裡我們就不直接介紹了


gcc和g++的區別

編譯c程式

熟悉C++的人應該都知道,C++是C語言的超集,編寫C/C++程式碼的時候,有人用gcc,也有人用g++,我們先來看看gcc和g++是否都能編譯C++和C程式碼: 


 
上圖中,我們發現用gcc和g++分別編譯test.c這個c檔案,發現都是可執行的,實際上對於C檔案gcc和g++所做的事情確實是一樣的,g++在編譯C檔案時呼叫了gcc.

編譯cpp程式

既然二者對c程式來說都一樣的,那為什麼兩者都存在而不是只存在一個呢,不要著急,下面我們來看看他們分別是如何來編譯C++程式的.
首先我們直接編譯c檔案生成可執行程式: 


 
我們發現gcc報錯,而g++沒有報錯,並且可以執行。

下面我們來看看它們的具體步驟以及錯誤原因:

預處理


 
在預處理階段兩條命令都能夠成功,並且我們觀察gcc和g++各自產生的.i字尾的檔案,它們的內容都是相同的,所以我們能夠發現gcc和g++在cpp程式中它們做了相同的事情。

編譯 
 

我們發現gcc編譯test1.i(.cpp生成)的會出現大篇幅的錯誤,圖片中的錯誤主要是說無法找到cout函數的庫檔案,而g++去可以通過編譯並且生成組合檔案,這件事情說明gcc無法自動和c++的庫檔案進行連線,導致了庫函數沒有申明的錯誤.

組合

這個過程應該都沒有問題,因為這個過程只是將字尾為.s檔案中的組合語言轉換成了相應的機器語言。所以gcc和g++應該在這個過程中做了同樣的事情。

連結


 
這個階段也出現了問題,用gcc將.cpp字尾產生的.o檔案轉換成可執行檔案時出現了錯誤,而g++卻可以轉換成功並且能夠正確執行。這個還是因為gcc無法將庫檔案與.o字尾的檔案關聯在一起生成可執行程式,而g++可以完成這項工作。


總結

gcc和g++的區別主要是在對cpp檔案的編譯和連結過程中,因為cpp和c檔案中庫檔案的命名方式不同,那為什麼g++既可以編譯C又可以編譯C++呢,這時因為g++在內部做了處理,預設編譯C++程式,但如果遇到C程式,它會直接呼叫gcc去編譯。


IT145.com E-mail:sddin#qq.com