(本文為自己參考網上的資料整理所得,如果有所紕漏或者錯誤,請留言指明!謝謝!)
gcc可以用來編譯連結.c來源程式,gcc同樣可以編譯.cpp檔案,但是不能連結.cpp檔案產生可執行檔。只有g++可以編譯並且連結.cpp,g++在編譯.cpp檔案的時候自動調用gcc進行源檔案的編譯。
下面來看看gcc/g++常用的參數。
一、gcc/g++常用的參數
-IDir
指定額外的標頭檔搜尋目錄,編譯器首先在Dir中尋找,然後按照常規的順序搜尋標頭檔。
-include file
相當於在來源程式中添加標頭檔,相當於#include "file"。
-LDir
指定編譯的時候編譯器搜尋的庫路徑。
-lLIBRARY
指定編譯的時候使用的庫。
-E
只啟用預先處理功能。
-S
只啟用先行編譯和編譯功能。
-c
只啟用預先處理、編譯和彙編功能。
-shared
產生共用目標檔案,通常用於建立共用庫時使用。
-static
禁止使用共用庫。
-w
不產生任何警告資訊。
-Wall
產生所有警告資訊。
-C
在預先處理的時候不刪除注釋資訊,一般和-E聯合使用,用於剖析器。
-M
組建檔案的關聯資訊,包含目標檔案產生所依賴的所有原始碼。
-MM
和上面的一樣,但是忽略標頭檔造成的依賴關係。
-MD、-MMD
對應和-M、-MM相同,只不過將輸出輸入到.d檔案中去。
二、gcc/g++執行的四個步驟
g++命令在最後產生可執行檔之前經曆了四個步驟,分別是預先處理、編譯、彙編和連結。我們通過使用g++的命令選項來查看g++命令執行過程中的步驟和每一步的組建檔案。
(1)前置處理器(前置處理器cpp)
g++ -E main.cpp > main.i
上面的命令只啟用預先處理,該過程並不組建檔案,我們採用輸出重新導向到main.i檔案中。預先處理主要是文法的檢查、宏替換、注釋的消除和找到相應的庫檔案。
(2)將預先處理後的檔案轉換成組合語言程式(編譯器egcs)
g++ -S main.i
上面的命令執行完成後產生main.s檔案,這是一個組合語言來源程式。
(3)將組合語言來源程式轉換成為目標檔案二進位機器碼(彙編器as)
g++ -c main.i
該命令執行之後產生main.o目標檔案,這就是二進位機器碼。
(4)連結目標檔案產生可執行程式(連結器ld)
g++ main.o
該命令執行之後便預設產生一個a.out的可執行檔,該過程是將main.o和所需的其他庫檔案連結產生可執行檔。
上面的四個步驟就是g++將原始碼產生可執行檔經曆的四個步驟。