gcc與g++的探究
阿新 • • 發佈:2018-10-31
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去編譯.
本文轉載自:http://blog.csdn.net/bit_clearoff/article/details/53965514