文章目錄
- 1.編譯程序
- 1.1直接編譯
- 1.2預處理
- 1.3編譯
- 1.4鏈接
- 1.5其它命令
- 2.函式庫
- 2.1什么是函式庫
- 2.2動靜態庫的差別
- 3.g++編譯器
1.編譯程序
我們可以直接用gcc對檔案完成編譯,也可以進行分步編譯,分步編譯的程序為預處理,編譯,匯編,鏈接;
1.1直接編譯

1.2預處理
預處理的功能:宏定義替換,檔案包含,條件編譯,去注釋等



gcc是如何找到對應的庫的呢?
在安裝gcc編譯器的時候,同時會進行一些庫的安裝,編譯器自身有能力去查找所需要的庫;
1.3編譯
gcc檢查代碼的規范性,是否有語法錯誤等,以及確定代碼的實際要做的作業,檢查無誤后,gcc將代碼翻譯成匯編語言,生成.o檔案,相當于windows中的obj檔案



1.4鏈接
將匯編之后生成的.o檔案進行鏈接,生成可執行程式
為什么需要鏈接?
因為我們的程式之中呼叫了函式介面,因此需要鏈接函式庫;

1.5其它命令
-shared:盡量使用動態庫進行編譯,生成的檔案會比較小但是需要系統具有動態庫
-O0
-O1
-O2
-O3 編譯器的4個優化選項,-O0沒有優化,-O1為系統預設,-O3優化級別最高,優化類似windows下的Release版本
-w:對語法檢測寬松,不生成任何警告資訊
-Wall:對語法檢測嚴格,生成所有警告資訊
2.函式庫
2.1什么是函式庫
由上述可知,我們在預處理階段只是將頭檔案“stdio.h”進行了包含,并且頭檔案中只有printf函式的宣告,并沒有實作,那么是在哪里實作函式的呢?
系統將這些函式的實作都放到了名為libc.so.6的庫檔案中去了,在沒有特別指定的時候,gcc會到系統默認的搜索路徑/usr/lib下進行查找,也就是鏈接到libc.so.6庫函式中去,這樣就實作了函式,這也是鏈接的作用;

2.2動靜態庫的差別

3.g++編譯器
程式的編譯程序并不是由編譯器決定的,因此用任何編譯器的編譯程序都是預處理,編譯,匯編,鏈接,g++編譯器的選項和gcc都是一樣的;


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/254485.html
標籤:其他
