Linux編譯器-gcc/g++使用:
寫在開篇:詳細介紹一哈 Linux下gcc/g++ 的使用,收藏起來呀~~
正文開始@Assassin
目錄:
- Linux編譯器-gcc/g++使用:
- 1. 背景知識:
- 2. gcc如何完成:
- 3. 編譯程序:
- 4. 預處理(進行宏替換):
- 5. 編譯(生成匯編):
- 6. 匯編(生成機器可識別代碼):
- 7. 連接(生成可執行檔案或庫檔案):
- 8. 這里涉及到一個重要的概念—>函式庫:
- 8.1 函式庫一般分為靜態庫和動態庫兩種:
- 9. gcc/g++選項:
- 10. gcc/g++選項記憶:
- 寫在結尾:
- see you next blog~~
1. 背景知識:
- 預處理(進行宏替換)
- 編譯(生成匯編)
- 匯編(生成機器可識別代碼)
- 連接(生成可執行檔案或庫檔案)
2. gcc如何完成:
格式 gcc [選項] 要編譯的檔案 [選項] [目標檔案]
3. 編譯程序:
- 預處理: 頭檔案展開,宏替換,注釋去掉
gcc -E hello.c -o hello.i - 編譯: C檔案變成匯編檔案
gcc -S hello.i -o hello.s - 匯編: 把匯編檔案變成二進制檔案
gcc -c hello.s -o hello.o - 鏈接: 把函式庫中的相應代碼組合到目標檔案中
gcc hello.o -o hello
注: 對應CPP編譯的話就把gcc換成g++就行了~~
4. 預處理(進行宏替換):
- 預處理功能主要包括宏定義,檔案包含,條件編譯,去注釋等,
- 預處理指令是以#號開頭的代碼行,
- 實體: gcc –E hello.c –o hello.i
- 選項"-E",該選項的作用是讓 gcc 在預處理結束后停止編譯程序,
- 選項"-o"是指目標檔案,".i"檔案為已經過預處理的C原始程式,
5. 編譯(生成匯編):
- 在這個階段中,gcc 首先要檢查代碼的規范性,是否有語法錯誤等,以確定代碼的實際要做的作業,在檢查無誤后,gcc 把代碼翻譯成匯編語言,
- 用戶可以使用"-S"選項來進行查看,該選項只進行編譯而不進行匯編,生成匯編代碼,
- 實體: gcc –S hello.i –o hello.s
6. 匯編(生成機器可識別代碼):
- 匯編階段是把編譯階段生成的".s"檔案轉成目標檔案
- 大伙在此可使用選項“-c”就可看到匯編代碼已轉化為".o"的二進制目標代碼了
- 實體: gcc –c hello.s –o hello.o
7. 連接(生成可執行檔案或庫檔案):
- 在成功編譯之后,就進入了鏈接階段,
- 實體: gcc hello.o –o hello
8. 這里涉及到一個重要的概念—>函式庫:
- 我們的C程式中,并沒有定義"printf"的函式實作,且在預編譯中包含的"stdio.h"中也只有該函式的宣告,而沒有定義函式的實作,那么,是在哪里實"printf"函式的呢?
- 最后的答案是:系統把這些函式實作都被做到名為 libc.so.6 的庫檔案中去了,在沒有特別指定時,gcc 會到系統默認的搜索路徑"/usr/lib"下進行查找,也就是鏈接到 libc.so.6 庫函式中去,這樣就能實作函式"printf"了,而這也就是鏈接的作用,
8.1 函式庫一般分為靜態庫和動態庫兩種:
- 靜態庫是指編譯鏈接時,把庫檔案的代碼全部加入到可執行檔案中,因此生成的檔案比較大,但在運行時也就不再需要庫檔案了,其后綴名一般為".a",
- 動態庫與之相反,在編譯鏈接時并沒有把庫檔案的代碼加入到可執行檔案中,而是在程式執行時由運行時鏈接檔案加載庫,這樣可以節省系統的開銷,動態庫一般后綴名為".so",如前面所述的 libc.so.6 就是動態庫,
gcc 在編譯時默認使用動態庫,完成了鏈接之后,gcc 就可以生成可執行檔案,如下所示:gcc hello.o –o hello, - gcc默認生成的二進制程式,是動態鏈接的,這點可以通過 file 命令驗證,
9. gcc/g++選項:
-E只激活預處理,這個不生成檔案,你需要把它重定向到一個輸出檔案里面,-S編譯到匯編語言不進行匯編和鏈接,-c編譯到目標代碼,-o檔案輸出到檔案,-static此選項對生成的檔案采用靜態鏈接,-g生成除錯資訊,GNU 除錯器可利用該資訊,-shared此選項將盡量使用動態庫,所以生成檔案比較小,但是需要系統由動態庫,-O0-O1-O2-O3編譯器的優化選項的4個級別,-O0表示沒有優化,-O1為預設值,-O3優化級別最高,-w不生成任何警告資訊,- -
W只生成編譯器認為會報錯的資訊, - -
Wall生成所有警告資訊, -I + 路徑提供編譯時所需頭檔案路徑,
10. gcc/g++選項記憶:
我的記憶技巧是:編譯帶選項時,你可以聯想到鍵盤上的ESC鍵,就是左上角的退出鍵,-E,-S,-c,是不是很有靈性[doge],然后依次生成的檔案可以聯想到你下載linux系統提供的 .iso 鏡像檔案,hhh,依次為 .i-----.s-----.o ,這下估計你一時半會兒忘不掉了hh----
寫在結尾:
有問題請issue我~~,謝謝大嘎^_^
see you next blog~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289584.html
標籤:其他
