??博主CSDN主頁(yè):杭電碼農(nóng)-NEO??
?
?專(zhuān)欄分類(lèi):Linux從入門(mén)到開(kāi)通?
?
??代碼倉(cāng)庫(kù):NEO的學(xué)習(xí)日記??
?
??關(guān)注我??帶你學(xué)更多操作系統(tǒng)知識(shí)
? ????
1. 前言
如果你不知道vim的各種用法和快捷鍵
請(qǐng)先閱讀上一篇文章: yum和vim詳解
現(xiàn)在,我們可以在Linux下編輯代碼了
編輯好的文件是一個(gè).c文件,vim不像
VS一樣既可以編寫(xiě)代碼也可以運(yùn)行代碼
在Linux中運(yùn)行代碼需要使用:gcc,g++
本章重點(diǎn):
本篇文章會(huì)著重講解gcc/g++的使用
以及程序翻譯的幾個(gè)過(guò)程和對(duì)應(yīng)的文件
最后講解動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的區(qū)別和聯(lián)系
2. gcc/g++的使用介紹
首先我們要明確一點(diǎn):
在之前的Linux學(xué)習(xí)中談到
Linux中不分文件后綴,所以文本文件可以
設(shè)置后綴為txt來(lái)提醒讀者這是一個(gè)文本文件
也可以什么都不寫(xiě)
但是Linux系統(tǒng)不分文件后綴
不代表Linux下的各種程序不分!
今天要學(xué)習(xí)的gcc和g++就是Linux下的程序
它們是要看文件后綴的!
gcc:
C語(yǔ)言編譯器,只能編譯C語(yǔ)言
g++:
C++編譯器,C/C++都可以編譯
gcc/g++使用方法:
生產(chǎn)的可執(zhí)行程序名字默認(rèn)為:a.out
gcc code.c
自定義可執(zhí)行程序的名字
gcc code.c -o 自定義名字
使用C99標(biāo)準(zhǔn)來(lái)編譯
gcc code.c -std=99
3. 執(zhí)行可執(zhí)行程序
執(zhí)行可執(zhí)行程序:
當(dāng)我們編譯好程序后,會(huì)在當(dāng)前目錄生成一個(gè)
可執(zhí)行程序,此文件通常是綠色的
此時(shí)我們只需要使用以下指令即可運(yùn)行代碼!
./a.out
注:.代表要在當(dāng)前目錄下找可執(zhí)行文件.必須加上
4. 程序翻譯的四個(gè)階段
雖然現(xiàn)在已經(jīng)掌握了如何編譯并運(yùn)行代碼
但是在C/C++代碼的翻譯過(guò)程中還有四個(gè)
階段值得我們?nèi)W(xué)習(xí):
- 預(yù)處理階段
- 編譯階段
- 匯編階段
- 鏈接階段
4.1 預(yù)處理階段
預(yù)處理階段要做的工作有:
- 頭文件展開(kāi)
- 去掉注釋
- 條件編譯
- 宏替換
那么預(yù)處理階段過(guò)后還是C語(yǔ)言嗎?
現(xiàn)在我們用Linux指令來(lái)查看一下:
使用指令:
gcc -E csdn.c -o csdn.i
指令解釋:將程序停留在預(yù)處理過(guò)程后,生成.i文件
現(xiàn)在我們使用vim編輯器打開(kāi).i件:
預(yù)處理階段
可以發(fā)現(xiàn),我們寫(xiě)的代碼在最下面
然而上面還有幾百行其實(shí)就是頭文件展開(kāi)
所謂頭文件展開(kāi)就是:
將頭文件的內(nèi)容拷貝到當(dāng)前文件
在頭文件中有許多空行,這是
因?yàn)樵鹊念^文件有注釋,此時(shí)注釋已經(jīng)沒(méi)了
注:其他工作大家可自行去驗(yàn)證
4.2 編譯階段
編譯階段的主要工作是:
- 將C語(yǔ)言翻譯為匯編代碼
編譯階段過(guò)后,就不是C語(yǔ)言了!
現(xiàn)在我們用Linux指令來(lái)查看一下:
使用指令:
gcc -S csdn.i -o csdn.s
指令解釋:將程序停留在編譯過(guò)程后,生成.s文件
注:可以由.c文件直接使用以上指令變成.s文件
使用vim編輯器打開(kāi).s文件:
B站視頻描述
可以發(fā)現(xiàn),現(xiàn)在的匯編代碼
如果沒(méi)有了解過(guò)是很難讀懂的
4.3 匯編階段
匯編階段的主要工作是:
- 將匯編代碼變成可重定位二進(jìn)制文件
匯編階段過(guò)后,文件存放的是二進(jìn)制信息!
現(xiàn)在我們用Linux指令來(lái)查看一下:
使用指令:
gcc -c csdn.s -o csdn.o
指令解釋: 將程序停留在匯編過(guò)程后,形成.o文件
注:這里也可以用.c或.i文件形成.o文件
此時(shí)使用vim打開(kāi)文件是亂碼
可以使用指令od查看二進(jìn)制文件:
B站視頻描述
4.4 鏈接階段
鏈接階段比較復(fù)雜,它大致的流程是這樣的:
.o文件 + 系統(tǒng)庫(kù) = 可執(zhí)行程序
在本篇文章的后半段講完動(dòng)靜態(tài)庫(kù)后再解釋!
5. 庫(kù)函數(shù)的命名和分類(lèi)(動(dòng)靜態(tài)庫(kù))
我們?cè)趯?xiě)C語(yǔ)言代碼時(shí)使用的printf函數(shù)
并沒(méi)有自己實(shí)現(xiàn),然而在stdio.h頭文件中
也只有printf函數(shù)的說(shuō)明,那么此函數(shù)的
實(shí)現(xiàn)是在哪里實(shí)現(xiàn)的呢?
引出今天的新內(nèi)容
查看一個(gè)可執(zhí)行程序依賴(lài)的第三方庫(kù)
使用指令:
ldd 可執(zhí)行程序名
可以發(fā)現(xiàn),在路徑lib64里有一個(gè)文件叫l(wèi)ibc.so.6
這個(gè)就是剛剛的C語(yǔ)言程序所要依賴(lài)的庫(kù)
對(duì)于庫(kù)名字的解釋:
可見(jiàn),libc.so.6實(shí)際上就是C的標(biāo)準(zhǔn)庫(kù)!
拓展:Linux和Windows下動(dòng)靜態(tài)庫(kù)命名區(qū)別:
- Linux下:
.so
是動(dòng)態(tài)庫(kù).a
是靜態(tài)庫(kù)
- Windows下:
.ddl
是動(dòng)態(tài)庫(kù).lib
是靜態(tài)庫(kù)
現(xiàn)在我們就可以理解鏈接過(guò)程了
鏈接過(guò)程就是將.o文件和動(dòng)/靜態(tài)庫(kù)結(jié)合的過(guò)程
6. 動(dòng)靜態(tài)庫(kù)的區(qū)別與優(yōu)缺點(diǎn)
通俗的來(lái)講,動(dòng)態(tài)庫(kù)類(lèi)似于網(wǎng)吧的電腦
而靜態(tài)庫(kù)類(lèi)似于自己家里的電腦
它們的區(qū)別是:
- 動(dòng)態(tài)庫(kù)是共享庫(kù),通過(guò)函數(shù)地址來(lái)關(guān)聯(lián)程序
- 靜態(tài)庫(kù)是私有庫(kù),可以獨(dú)立運(yùn)行
動(dòng)態(tài)庫(kù):
是C/C++或其他第三方提供的所有方法的集合,被所有程序以動(dòng)態(tài)鏈接的方式關(guān)聯(lián)起來(lái)
靜態(tài)庫(kù):
是C/C++或其他第三方提供的所有方法的集合,被所有程序以拷貝的方式,將需要的代碼拷貝至自己的可執(zhí)行程序當(dāng)中!
說(shuō)白了,靜態(tài)庫(kù)是將所有代碼拷貝過(guò)來(lái)
而動(dòng)態(tài)庫(kù)是去找函數(shù)的地址調(diào)用此函數(shù)
動(dòng)靜態(tài)庫(kù)的優(yōu)缺點(diǎn):
-
動(dòng)態(tài)庫(kù):
優(yōu)點(diǎn):形成的可執(zhí)行程序體積較小,節(jié)省資源
缺點(diǎn):要找函數(shù)地址,會(huì)稍慢一點(diǎn),并且有強(qiáng)依賴(lài)性 -
靜態(tài)庫(kù):
優(yōu)點(diǎn):無(wú)視庫(kù),可以獨(dú)立運(yùn)行
缺點(diǎn): 體積太大,浪費(fèi)資源
我們?cè)诰幾g代碼時(shí),默認(rèn)使用的是動(dòng)態(tài)庫(kù)
并且Linux下絕大多數(shù)庫(kù)都是動(dòng)態(tài)庫(kù)!
如果你想使用靜態(tài)庫(kù)編譯代碼
使用指令:
gcc code.c -static
7.總結(jié)以及拓展
總的來(lái)說(shuō)gcc,g++這兩個(gè)編譯器并不難
掌握它們就需要學(xué)會(huì)使用一些特殊的指令
這里列出一些gcc常用的指令
大家可以下來(lái)自己嘗試:
拓展: 計(jì)算機(jī)語(yǔ)言發(fā)展史和C/C++的翻譯過(guò)程
眾所周知,計(jì)算機(jī)只認(rèn)識(shí)二進(jìn)制碼是因?yàn)?br> 計(jì)算機(jī)內(nèi)的硬件元器件只認(rèn)識(shí)二進(jìn)制(正電/負(fù)電)
最開(kāi)始和計(jì)算機(jī)交流是用二進(jìn)制進(jìn)行交流
最經(jīng)典的用具就是二進(jìn)制打孔膠帶
科學(xué)家覺(jué)得用二進(jìn)制交流非常不方便!
于是發(fā)明了匯編語(yǔ)言,匯編語(yǔ)言和匯編編譯器
都是用二進(jìn)制碼寫(xiě)的,當(dāng)這一過(guò)程被完善后
就可以用匯編語(yǔ)言來(lái)重新編寫(xiě)匯編編譯器了!
有了匯編語(yǔ)言后陸陸續(xù)續(xù)又發(fā)展了許多語(yǔ)言
最經(jīng)典的莫過(guò)于C語(yǔ)言!然而C語(yǔ)言是用匯編
代碼編寫(xiě)的,C語(yǔ)言的編譯器也是用匯編代碼寫(xiě)的
當(dāng)這一過(guò)程成熟后,就可以用C語(yǔ)言程序編寫(xiě)
C語(yǔ)言的編譯器了,于是語(yǔ)言才慢慢發(fā)展起來(lái)
結(jié)論:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-724952.html
通過(guò)了解C語(yǔ)言的歷史我們發(fā)現(xiàn)
C語(yǔ)言的翻譯過(guò)程正是它的歷史過(guò)程!
先從C語(yǔ)言翻譯為匯編,再?gòu)膮R編翻譯為二進(jìn)制
因?yàn)榇罄锌偸嵌谜驹诰奕说募缟?有前人
編寫(xiě)了從匯編到二進(jìn)制的代碼,那么我們就
不用再寫(xiě)直接從C語(yǔ)言到二進(jìn)制的代碼了一是方便了科學(xué)家本身,二是讓我們勿忘歷史!
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-724952.html
到了這里,關(guān)于【linux基礎(chǔ)(六)】Linux中的開(kāi)發(fā)工具(中)--gcc/g++的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!