Linux的gcc和g++的區別

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

工具用法介紹

gcc和g++的用法都是一樣的,在這裏我們只介紹gcc:
這裏寫圖片描述

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

  1. gcc -E filename.c -o filename.i
    將c文件轉化成C++文件,這個過程也叫做預處理過程
  2. gcc -S filename.i -o filename.s
    將預處理過程生成的.i後綴的文件轉化成彙編文件,裏面存儲的是相應的彙編代碼,這個過程叫做編譯。
  3. gcc -c filename.s -o filename.o
    將彙編文件中的彙編代碼翻譯成相應的機器語言,這個過程叫做彙編。
  4. gcc filename.o -o filename.exe
    這條指令是完成鏈接這個過程的,它通過鏈接器ld將運行程序的目標文件和庫文件鏈接在一起,生成最後的可執行文件
  5. 生成可執行文件後,我們就能夠調用相應的程序了。
    注意:由於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去編譯.

發佈了89 篇原創文章 · 獲贊 190 · 訪問量 21萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章