1.gcc/g++
gcc是對c語言代碼進行編譯鏈接,而g++是對c++代碼進行編譯鏈接,接下來我們只對gcc進行講解,g++的使用方法跟gcc是一樣的。
編譯鏈接的四個步驟:
1:預處理
2:編譯
3:匯編
4:鏈接
注:這些在后面都會著重講解
1.1gcc?-o?
我們先在Date.c?源文件里面寫一些c語言代碼,我們知道,c語言代碼需要編譯鏈接翻譯為計算機能識別的二進制指令才能執(zhí)行。而gcc就是Linux環(huán)境下用來對c語言代碼編譯鏈接的指令.
gcc?源文件 -o?生成指定的文件名
gcc Date.c -o date.aout
注:這里會一步到位,直接會生成一個可執(zhí)行程序,接下來我們再一步一步分析具體細節(jié)
1.2gcc -E (預處理)(.i)
預處理:頭文件展開、去注釋、宏替換、條件編譯
-E:當程序進行翻譯時,預處理階段執(zhí)行完就停下來
gcc Date.c -o date.aout -E
頭文件展開:#include<stdio.h>這個文件里面有很多函數(shù)的聲明和typedef的內(nèi)容,頭文展開會將stdio.h這個文件中所有的內(nèi)容復制一份到我們的date.i文件中。
去注釋:會將我們注釋的內(nèi)容替換為空格。
1.3gcc -S (編譯)(.s)
編譯:將c語言寫的內(nèi)容翻譯為匯編語言
-S:當程序進行翻譯時,編譯階段執(zhí)行完就停下來
gcc Date.c -o date.s?-S
1.4gcc -c?(匯編)(.o)
匯編:將匯編語言翻譯為二進制語言。
-c:當程序進行翻譯時,編譯階段執(zhí)行完就停下來
gcc Date.c -o date.o?-c
1.5gcc -o (鏈接)
當我們不帶-E、-S、-c這些選項時,直接-o,gcc就會一步到位從預處理階段到編譯,再到匯編,最后到鏈接?。。?/strong>
在我們上面寫的c語言代碼中,我們并沒有寫printf函數(shù)的具體實現(xiàn),而在<stdio.h>這個文件中也只有printf函數(shù)的聲明而沒有其具體實現(xiàn)的定義,那么我們再使用printf這個函數(shù)的時候怎么去調(diào)用這個函數(shù)呢?
在Linux Centos7?環(huán)境下,系統(tǒng)把這些函數(shù)的具體實現(xiàn)都放在了一個名為libc.so.6的庫文件中了,路徑為/usr/lib/libc.so.6,當我們調(diào)用printf函數(shù)時,會去libc.so.6庫文件中去尋找printf實現(xiàn)的實現(xiàn)方法,最終成功調(diào)用。
我們可以使用ldd +?可執(zhí)行程序 來查看該可執(zhí)行程序依賴了那些庫文件
2.動態(tài)庫/靜態(tài)庫?
2.1.再談鏈接
鏈接的時候,我們是怎么去庫文件中尋找函數(shù)具體實現(xiàn)的方法的呢?
有兩種情況,一種是我們得到函數(shù)的地址,在生成可執(zhí)行程序時根據(jù)地址去調(diào)用這個函數(shù),另一種則是我們得到這個函數(shù)的整體實現(xiàn)過程,在生成可執(zhí)行程序時將函數(shù)實現(xiàn)的代碼加載進來。
根據(jù)鏈接方式的不同,庫文件也就分成了兩種:動態(tài)庫/靜態(tài)庫,動態(tài)庫使用動態(tài)鏈接,靜態(tài)庫使用靜態(tài)鏈接。
2.2動態(tài)庫
注:gcc在編譯時默認使用動態(tài)庫!??!優(yōu)點:比較節(jié)省資源(磁盤、內(nèi)存、網(wǎng)絡等資源),不會出現(xiàn)太多重復代碼缺點:太過于依賴庫,一旦庫缺失,所有使用該庫的程序都不能運行?。?!

2.3靜態(tài)庫
優(yōu)點:不依賴庫,同類型平臺中可以直接運行使用。缺點:可執(zhí)行程序占用空間比較大,比較浪費資源(磁盤、內(nèi)存、網(wǎng)絡等資源)
gcc編譯時使用-static選項可以在鏈接時使用靜態(tài)鏈接的方式鏈接靜態(tài)可。
gcc -o mybin-static test.c -static
但是我們直接執(zhí)行的話會出現(xiàn)問題,這里的原因是因為我們的系統(tǒng)中沒用靜態(tài)庫,導致靜態(tài)鏈接失敗。我們可以使用yum命令下載c/c++的靜態(tài)庫,在root用戶下執(zhí)行,或者使用sudo命令。如果不清楚yum命令的可以看我這一篇博客http://t.csdnimg.cn/M1JLr
sudo yum install -y glibc-static libstdc++-static
安裝好靜態(tài)庫之后?我們再進行一次編譯gcc -o mybin-static test.c -static
文章來源:http://www.zghlxwxcb.cn/news/detail-752740.html
由圖可知,靜態(tài)鏈接靜態(tài)庫生成的可執(zhí)行程序比動態(tài)鏈接動態(tài)庫生成的可執(zhí)行程序要大得多文章來源地址http://www.zghlxwxcb.cn/news/detail-752740.html
到了這里,關于Linux下Centos7 gcc/g++、動態(tài)庫/靜態(tài)庫(動態(tài)/靜態(tài)鏈接)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!