Linux系统编程5:入门篇之在Linux下观察C/C++程序编译过程 gcc/g++使用详解
生活随笔
收集整理的這篇文章主要介紹了
Linux系统编程5:入门篇之在Linux下观察C/C++程序编译过程 gcc/g++使用详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- (1)gcc/g++完成編譯的過程
- A:預處理
- B:編譯
- C:匯編
- D:鏈接
- (2)gcc/g++選項
- (3)重要概念:函數庫
- A:gcc/g++在哪實現了函數
- B:靜態庫與動態庫
(1)gcc/g++完成編譯的過程
A:預處理
- 預處理主要包括宏定義,文件包含,條件編譯,去注釋
- 輸入gcc -E hello.c -o hello.i,其中選項E作用是讓gcc在預處理后停止編譯
B:編譯
- 此階段,gcc檢查代碼的規范性,是否具有語法錯誤
- 輸入gcc -S hello.i -o hello.s,即可將預處理里的結果繼續繼續編譯
C:匯編
- 編譯階段無誤后,進入匯編,將“.s”文件轉化為“.o”二進制文件
- 輸入gcc -c hello.s -o hello.o,即可將編譯停止在此階段
(打開二進制文件使用od命令)
D:鏈接
- 此階段,將目標文件與系統庫進行鏈接生成可執行文件。
- 輸入gcc hello.o -o hello,則完成編譯
(2)gcc/g++選項
| -E | 進行預處理,不進行編譯,匯編和鏈接 |
| =S | 進行編譯,不進行匯編和鏈接 |
| -c | 進行匯編,不進行鏈接 |
| -o | 鏈接 |
| static | 采用靜態鏈接 |
| -g | 生成調試信息 |
| -shared | 使用動態庫 |
| -O0 | 無優化 |
| -O1 | 默認優化級別 |
| -O3 | 優化最高 |
| -w | 不生成警告信息 |
| -Wall | 生成所有警告信息 |
(3)重要概念:函數庫
A:gcc/g++在哪實現了函數
在學C語言是,我們知道想要向屏幕正常打印字符,則必須在頭部引入#inlcude <stdio.h>這樣的頭文件,因為printf函數的是在其中實現的
在剛才的例子中,查看hello.i,也就是預編譯生成的文件,可以發現#include <stdio.h>,在如下路徑中
進入該路徑,可以發現這里存放的便是頭文件
可是gcc為什么知道頭文件會在這個路徑下的呢?實際上,在沒有特別指定時,gcc會默認搜索路徑/usr/lib,并進行查找。這也就是引用頭文件時兩種方式的區別所在:#include <stdio.h>會在設定目錄下尋找,而#include "Myhead.h",會在當前目錄下尋找。
B:靜態庫與動態庫
- 靜態庫是指編譯鏈接時,把庫文件的代碼全部加入到可執行文件中,因此生成的文件比較大,但在運行時也就不再需要庫文件了。其后綴名為.a。輸入gcc hello.c -o helloc -static,,采用靜態鏈接
- 動態庫在編譯鏈接時并沒有把庫文件的代碼加入到可執行文件中,而是在程序運行時由運行時鏈接文件加載庫,這樣做可以節省系統開銷。動態庫后綴名一般為.so,gcc在編譯時默認使用動態庫,完成鏈接之后,就生成了可執行文件。
所以動態鏈接形成的程序體積較小,比較節省資源,但是一旦庫丟失,程序就不可以運行了;而靜態形成的程序的體積很大,但具有獨立性,即便庫丟失,也不影響程序運行。
總結
以上是生活随笔為你收集整理的Linux系统编程5:入门篇之在Linux下观察C/C++程序编译过程 gcc/g++使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (王道408考研数据结构)第二章线性表-
- 下一篇: mac之brew安装卸载使用