1、預處理,生成 .i 的檔案[預處理器cpp]
2、將預處理後的檔案轉換成組合語言, 生成檔案 .s [編譯器egcs]
3、有彙編變為目標**(機器**)生成 .o 的檔案[彙編器as]
4、連線目標**, 生成可執行程式 [鏈結器ld]
過程如下:
預處理器:將.c 檔案轉化成 .i 檔案,使用的 gcc 命令是:gcc –e,對應於預處理命令 cpp;
編譯器:將.c/.h 檔案轉換成.s 檔案,使用的 gcc 命令是:gcc –s,對應於編譯命令 cc –s;
彙編器:將.s 檔案轉化成 .o 檔案,使用的 gcc 命令是:gcc –c,對應於彙編命令是 as;
鏈結器:將.o 檔案轉化成可執行程式,使用的 gcc 命令是: gcc,對應於鏈結命令是 ld;
載入器:將可執行程式載入到記憶體並進行執行,loader 和 ld-linux.so。
後面的**以hello.cpp為例
#include int main()
設定檔案所使用的語言, 使字尾名無效, 對以後的多個有效。也就是根據約定 c 語言的字尾名稱是 .c 的,而 c++ 的字尾名是 .c 或者 .cpp, 如果你很個性,決定你的 c **檔案的字尾名是 .pig 哈哈,那你就要用這個引數, 這個引數對他後面的檔名都起作用,除非到了下乙個引數的使用。 可以使用的引數有下面的這些:'c', 'objective-c', 'c-header', 'c++', 'cpp-output', 'assembler', 與 'assembler-with-cpp'
。
看到英文,應該可以理解的。
例子用法:
gcc -x c hello.cpp
即用c語言編譯.cpp檔案
只啟用預處理,編譯,和彙編,也就是他只把程式做成obj檔案
例子用法:
gcc -c hello.cpp
即將hello.cpp預處理、編譯(狹義的,指編譯到組合語言)、編譯(廣義的,指從彙編編譯到機器碼)
將生成.o檔案,還沒有鏈結
例子
gcc -c hello.cpp
image.png
只啟用預處理和編譯,就是指把檔案編譯成為彙編**。
例子用法:
gcc -s hello.cpp
他將生成 .s 的彙編**,你可以用文字編輯器察看。
這是乙個hello.cpp的彙編原始碼
只啟用預處理,這個不生成檔案, 你需要把它重定向到乙個輸出檔案裡面。
例子用法:
gcc -e hello.cpp > hello.txt
gcc -e hello.cpp | more
慢慢看吧, 乙個 hello word 也要與處理成800行的**。
可以看到,mac上預處理之後有500行
制定目標名稱, 預設的時候, gcc 編譯出來的檔案是 a.out, 很難聽, 如果你和我有同感,改掉它, 哈哈。
例子用法:
gcc -o hello.exe hello.cpp
即將hello.cpp檔案生成可執行檔案hello.exe
關閉 gnu c中與 ansi c 不相容的特性, 啟用 ansi c 的專有特性(包括禁止一些 asm inline typeof 關鍵字, 以及 unix,vax 等預處理巨集)。
此選項實現 ansi 選項的功能的一部分,它禁止將 asm, inline 和 typeof 用作關鍵字。
只對 g++ 起作用, 使用這個選項, g++ 將對不帶引數的函式,都認為是沒有顯式的對引數的個數和型別說明,而不是沒有引數。
而 gcc 無論是否使用這個引數, 都將對沒有帶引數的函式, 認為城沒有顯式說明的型別。
就是向傳統 c++ 看齊, 可以使用 this 當一般變數使用。
允許條件表示式的第二和第三引數型別不匹配, 表示式的值將為 void 型別。
這四個引數是對 char 型別進行設定, 決定將 char 型別設定成 unsigned char(前兩個引數)或者 signed char(後兩個引數)。
包含某個**,簡單來說,就是便以某個檔案,需要另乙個檔案的時候,就可以用它設定,功能就相當於在**中使用
將 file 檔案的巨集, 擴充套件到 gcc/g++ 的輸入檔案, 巨集定義本身並不出現在輸入檔案中。
相當於 c 語言中的 #define macro
相當於 c 語言中的 #define macro=defn
相當於 c 語言中的 #undef macro
取消對任何非標準巨集的定義
在你是用 #include "file" 的時候, gcc/g++ 會先在當前目錄查詢你所制定的標頭檔案, 如果沒有找到, 他回到預設的頭檔案目錄找, 如果使用 -i 制定了目錄,他會先在你所制定的目錄查詢, 然後再按常規的順序去找。
對於 #include, gcc/g++ 會到 -i 制定的目錄查詢, 查詢不到, 然後將到系統的預設的頭檔案目錄查詢 。
就是取消前乙個引數的功能, 所以一般在 -idir 之後使用。
在 -i 的目錄裡面查詢失敗, 講到這個目錄裡面查詢。
一般一起使用, 當 -i 的目錄查詢失敗, 會到 prefix+dir 下查詢
使編譯器不再系統預設的頭檔案目錄裡面找標頭檔案, 一般和 -i 聯合使用,明確限定標頭檔案的位置。
規定不在 g++ 指定的標準路經中搜尋, 但仍在其他路徑中搜尋, 此選項在創 libg++ 庫使用 。
在預處理的時候, 不刪除注釋資訊, 一般和-e使用, 有時候分析程式,用這個很方便的。
制定編譯的時候使用的庫
例子用法
gcc -lcurses hello.c
使用 ncurses 庫編譯程式
制定編譯的時候,搜尋庫的路徑。比如你自己的庫,可以用它制定目錄,不然編譯器將只在標準庫的目錄找。這個dir就是目錄的名稱。
編譯器的優化選項的 4 個級別,-o0 表示沒有優化, -o1 為預設值,-o3 優化級別最高。
只是編譯器,在編譯的時候,產生除錯資訊。
此選項將盡可能的生成 gdb 的可以使用的除錯資訊。
此選項將禁止使用動態庫,所以,編譯出來的東西,一般都很大,也不需要什麼動態連線庫,就可以執行。
此選項將盡量使用動態庫,所以生成檔案比較小,但是需要系統由動態庫。
選項 解釋
-c 只編譯並生成目標檔案。
-dmacro 以字串"1"定義 macro 巨集。
-dmacro=defn 以字串"defn"定義 macro 巨集。
-e 只執行 c 預編譯器。
-g 生成除錯資訊。gnu 偵錯程式可利用該資訊。
-idirectory 指定額外的標頭檔案搜尋路徑directory。
-ldirectory 指定額外的函式庫搜尋路徑directory。
-llibrary 連線時搜尋指定的函式庫library。
-m486 針對 486 進行**優化。
-o file 生成指定的輸出檔案。用在生成可執行檔案時。
-o0 不進行優化處理。
-o 或 -o1 優化生成**。
-o2 進一步優化。
-o3 比 -o2 更進一步優化,包括 inline 函式。
-shared 生成共享目標檔案。通常用在建立共享庫時。
-static 禁止使用共享連線。
-umacro 取消對 macro 巨集的定義。
-w 不生成任何警告資訊。
-wall 生成所有警告資訊。
gcc 引數詳解
gcc引數詳解 介紹 gcc and g 分別是gnu的c c 編譯器 gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器 cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器 egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器 as 4.連線...
gcc引數詳解
gcc and g 分別是gnu的c c 編譯器 gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器as 4.連線目標 生成可執行程式 鏈結器...
GCC引數詳解
gcc and g 分別是gnu的c c 編譯器 gcc g 在執行編譯工作的時候,總共需要4步 1.預處理,生成.i的檔案 預處理器cpp 2.將預處理後的檔案不轉換成組合語言,生成檔案.s 編譯器egcs 3.有彙編變為目標 機器 生成.o的檔案 彙編器as 4.連線目標 生成可執行程式 鏈結器...