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