库文件与头文件
? ? ? ? 首先說明庫(kù)文件與頭文件在gcc中的具體使用方法,然后說明兩者的區(qū)別與聯(lián)系。
? ? ? ? 庫(kù)文件即庫(kù)函數(shù),如printf和scanf函數(shù)。以libgtdf.so庫(kù)文件為例(庫(kù)文件在命名時(shí)都以lib開頭,因此使用-l選項(xiàng)去鏈接指定的庫(kù)文件時(shí)可以省略lib三個(gè)字母,即-lgtdf),一般庫(kù)文件如果是放在/lib,/usr/lib,/usr/local/lib目錄(庫(kù)文件的默認(rèn)目錄)下,則無需額外處理,編譯鏈接時(shí)-lgtdf會(huì)自動(dòng)找到對(duì)應(yīng)文件不會(huì)報(bào)錯(cuò),但是如果不在對(duì)應(yīng)目錄,則需要加上-L? 所在目錄 -lgtdf才能找到對(duì)應(yīng)的庫(kù)文件。頭文件一般是采用源文件中用#include命令包含,頭文件如果放在/usr/include目錄下則會(huì)自動(dòng)找到不會(huì)報(bào)錯(cuò),否則編譯鏈接時(shí)需要使用-I? 所在目錄才能正確找到。頭文件不需要具體指定是哪個(gè)頭文件,因?yàn)樵谠创a文件中#include已經(jīng)有說明,因此只需要-I參數(shù)指明目錄即可,但是庫(kù)文件需要-l參數(shù)指定是哪個(gè)庫(kù)文件。例如:g++ test.cpp -o test.txt -L /mytest/lib -lgtdf -I /mytest/include? 也等價(jià)于: gcc -lstdc++ test.cpp?-o test.txt -L /mytest/lib -lgtdf -I /mytest/include? ? ?即gcc在編譯C++文件時(shí)需要加上-lstdc++參數(shù),具體原因可以參考之前的文章。
? ? ? ??#include< > 與 #include“ ” 的區(qū)別:尖括號(hào)為系統(tǒng)標(biāo)準(zhǔn)庫(kù)頭文件,會(huì)自動(dòng)在/usr/include目錄下查找,引號(hào)為用戶自己定義的頭文件,在未指定目錄的情況下,會(huì)先在當(dāng)前工作目錄內(nèi)查找,當(dāng)前工作目錄找不到再在/usr/include目錄下查找。-I指定目錄時(shí),先在指定目錄和當(dāng)前工作目錄查找,然后在/usr/include目錄下查找。? ? ??
? ? ? ? Linux下的庫(kù)文件分為兩大類,分別為動(dòng)態(tài)鏈接庫(kù)(.so)和靜態(tài)鏈接庫(kù)(.a),兩者的差別僅在于程序執(zhí)行時(shí)所需要的代碼是在運(yùn)行時(shí)動(dòng)態(tài)加載的,還是編譯時(shí)靜態(tài)加載的。默認(rèn)情況下,gcc在鏈接時(shí)優(yōu)先使用動(dòng)態(tài)鏈接庫(kù),只有在動(dòng)態(tài)鏈接庫(kù)不存在時(shí),才會(huì)使用靜態(tài)鏈接庫(kù)。如果需要的話,可以在編譯時(shí)加上-static選項(xiàng),強(qiáng)制使用靜態(tài)鏈接庫(kù)。如在/home/zsx/lib目錄內(nèi)部由libfoo.so 和libfoo.a文件,為了讓gcc只用到靜態(tài)鏈接庫(kù),而不使用動(dòng)態(tài)鏈接庫(kù),則可以:gcc foo.c -L /home/zsx/lib -static -lfoo -o foo? ? ? ? ?ldd命令用來顯示二進(jìn)制代碼文件動(dòng)態(tài)庫(kù)的鏈接情況,如:ldd foo??
? ? ? ? 頭文件是文本文件,是可供閱讀的;庫(kù)文件是二進(jìn)制文件,不可直接閱讀。庫(kù)文件是將一系列的源文件進(jìn)行編譯打包,形成的二進(jìn)制文件包,其中封裝著函數(shù)接口,在編程中可以由其它源文件調(diào)用。庫(kù)文件可分為靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)兩種。
? ? ? ? 頭文件在編譯中使用;庫(kù)文件在鏈接中使用。頭文件中是函數(shù)或定義的聲明,及少量?jī)?nèi)聯(lián)函數(shù)的使用,一般不包含非靜態(tài)函數(shù)實(shí)現(xiàn);庫(kù)文件中包含函數(shù)的實(shí)現(xiàn)。頭文件是手動(dòng)編寫的,庫(kù)文件是編譯生成的。
? ? ? ??雖然沒有規(guī)定調(diào)用庫(kù)函數(shù)必須引用頭文件,但一般約定,當(dāng)調(diào)用庫(kù)函數(shù)的時(shí)候需要引用接口函數(shù)所在的頭文件。
? ? ? ??一個(gè)庫(kù)文件均有一組頭文件與其對(duì)應(yīng)。庫(kù)文件和對(duì)應(yīng)頭文件的作者應(yīng)為同一個(gè)。作者必須保證頭文件中所聲明的函數(shù)類型及參數(shù)列表,與庫(kù)文件中的實(shí)現(xiàn)是相同的。
? ? ? ? 具體來說,頭文件中有函數(shù)的申明,庫(kù)文件實(shí)現(xiàn)函數(shù)的定義。比如,printf函數(shù)。使用時(shí)應(yīng)包括stdio.h,打開stdio.h你只能看到,printf這個(gè)函數(shù)的申明,卻看不到printf具體是怎么實(shí)現(xiàn)的,而函數(shù)的實(shí)現(xiàn)在相應(yīng)的C庫(kù)中。而庫(kù)文件一般是以二進(jìn)制形式而不是C源文件形式提供給用戶使用的。程序中包括了stdio.h這個(gè)頭文件。鏈接器就能根據(jù)頭件中的信息找到printf這個(gè)函數(shù)的實(shí)現(xiàn)并鏈接進(jìn)這個(gè)程序代碼段里。總結(jié)起來就是,庫(kù)文件通過頭文件向外導(dǎo)出接口。用戶通過頭文件找到庫(kù)文件中函數(shù)實(shí)現(xiàn)的代碼從而把這段代碼鏈接到用戶程序中去。
總結(jié)
- 上一篇: arr.reduce(callbackf
- 下一篇: 我要活下去剧情介绍