# GCC與編譯過程 ###### tags: `code` `gcc` `compile` `C` ###### 撰寫時間 : 2021/08/17 ## 流程圖  ## 編譯過程 ### 編輯器 (Editor) 檔名: `.c` - vim - vscode ### 預處理器(Preprocessor) 檔名: `.c` -> `.i` <br> 將包含標頭檔文件插入原文件中、將macro展開展開、根據條件編譯命令選擇要使用的代碼 - header files[`#include`](https://zh.wikipedia.org/wiki/%E5%A4%B4%E6%96%87%E4%BB%B6) - macro 展開[`#define`](https://openhome.cc/Gossip/CGossip/Macro.html) - 條件編譯命令`#if`,`#ifdef` ### 編譯器(Compiler) 檔名: `.i` -> `.s` <br> 包含詞法分析 (Lexical analysis)、語法分析 (Parsing、Syntax analysis)、語意分析 (Semantic analysis)、符號表 (Symbol Table)、中間碼產生 (Intermediate Code Generation)、最佳化 (Code Optimization)、目標語言產生 (Code Generation) - 組合語言 (Assembly) 會針對不同電腦架構(`x86-64`、`ARM`、`MIPS`)及作業系統(`linux`, `MacOS`,`Linux`)而有不同,會需要這樣是因為對於不同的架構可以有不同的優化方式,並且可以使高階語言有可攜性,代表高階語言不需要為了不同的環境寫不同的程式碼,而是透過編譯器將程式碼轉成對應環境的組合語言 ### 組譯器 (Assembler) 檔名: `.s` -> `.o` (obj文件) <br> 將低階語言所寫的程式翻譯成目的檔 - 目的碼(Object codes) CPU 可以直接執行的機器碼 (Machine code) 或是暫存器傳遞語言 (Register transfer language、RTL),GCC 為後者 目的檔可以透過連結成為可執行檔或是函式庫 (Library) ### 連結器 (Linker) 檔名: `.o` -> `執行檔`(default `a.out`) <br> 將多個目標檔或靜態函式庫 (Static library) 合併成一個可執行檔或函式庫的工具  ### 載入器 (Loader) 是作業系統的一部份,用於把程式和動態函式庫 (Shared library) 的指令載入到記憶體 (RAM) 中等待 CPU 執行,當載入完成之後,作業系統會將控制權交給載入的程式碼,讓它開始運作 ### CPU (Central Processing Unit) 對載入的指令進行運算或儲存等操作 ## gcc編譯過程 1. 預處理 > (不生成文件,需要把它重定向到一個輸出文件裡面) ``` gcc -E hello.c > pianoapan.txt ``` 2. 預處理、編譯 >`.c` -> `.s` ``` gcc -S hello.c ``` 3. 預處理、編譯、組譯 > `.c` -> `.o` ``` gcc -c hello.c ``` 4. 預處理、編譯、組譯、連結 > `.c` -> `執行檔`(default `a.out`) ``` gcc hello.c ``` 5. 載入器、CPU 執行檔 > (default `a.out`) -> 執行結果 ``` ./a.out ``` ## gcc其他參數 ## Tips - 如果文件非常多的時候,只是修改了一個文件,所有文件都會被重新編譯一次,編譯的時候就會需要很長時間。 - 對於這些源文件,我們應該寫`Makefile`分別處理,執行:預處理 編譯 匯編 ,先分別編譯它們,最後再把它們連接 ## 介紹文章與參考資料 - [GCC和Makefile编译过程](https://blog.csdn.net/sinat_31039061/article/details/98885275) - [C 語言編譯到執行流程](https://aben20807.blogspot.com/2018/08/1070824-c.html) - [GCC 編譯器基本使用教學與範例](https://blog.gtwang.org/programming/gcc-comipler-basic-tutorial-examples/) - [Makefile的写法影片](https://www.youtube.com/watch?v=E1_uuFWibuM) - [Debugging - GDB Tutorial Clip](https://www.youtube.com/watch?v=bWH-nL7v5F4) - [官方文檔](https://gcc.gnu.org/onlinedocs/gcc/Invoking-GCC.html) - [相關參數整理](https://gist.github.com/idhowardgj94/9a3a523e66f04ca87c3c41fa691128c5#:~:text=GCC%20%E6%98%AFGNU%20%E7%9A%84C,%E4%B8%A6%E7%94%9F%E6%88%90%E5%8F%AF%E5%9F%B7%E8%A1%8C%E6%96%87%E4%BB%B6%E3%80%82)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up