【C/C++】Linux的gcc和g++的區別


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++沒有報錯,並且可以執行。

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

  1. 預處理 

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

   2.編譯 

我們發現gcc編譯test1.i(.cpp生成)的會出現大篇幅的錯誤,圖片中的錯誤主要是說無法找到cout函數的庫文件,而g++去可以通過編譯並且生成匯編文件,這件事情說明gcc無法自動和c++的庫文件進行連接,導致了庫函數沒有聲明的錯誤.
   3.匯編
這個過程應該都沒有問題,因為這個過程只是將后綴為.s文件中的匯編語言轉換成了相應的機器語言。所以gcc和g++應該在這個過程中做了同樣的事情
   4.鏈接

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

總結

gcc和g++的區別主要是在對cpp文件的編譯和鏈接過程中,因為cpp和c文件中庫文件的命名方式不同,那為什么g++既可以編譯C又可以編譯C++呢,這時因為g++在內部做了處理,默認編譯C++程序,但如果遇到C程序,它會直接調用gcc去編譯

 

轉自:https://blog.csdn.net/bit_clearoff/article/details/53965514


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM