![Linux動態(tài)鏈接庫.so文件的創(chuàng)建與使用_第1頁](http://file4.renrendoc.com/view/e56ffc1a1deabdad6688ead1a72f5ac9/e56ffc1a1deabdad6688ead1a72f5ac91.gif)
![Linux動態(tài)鏈接庫.so文件的創(chuàng)建與使用_第2頁](http://file4.renrendoc.com/view/e56ffc1a1deabdad6688ead1a72f5ac9/e56ffc1a1deabdad6688ead1a72f5ac92.gif)
![Linux動態(tài)鏈接庫.so文件的創(chuàng)建與使用_第3頁](http://file4.renrendoc.com/view/e56ffc1a1deabdad6688ead1a72f5ac9/e56ffc1a1deabdad6688ead1a72f5ac93.gif)
![Linux動態(tài)鏈接庫.so文件的創(chuàng)建與使用_第4頁](http://file4.renrendoc.com/view/e56ffc1a1deabdad6688ead1a72f5ac9/e56ffc1a1deabdad6688ead1a72f5ac94.gif)
![Linux動態(tài)鏈接庫.so文件的創(chuàng)建與使用_第5頁](http://file4.renrendoc.com/view/e56ffc1a1deabdad6688ead1a72f5ac9/e56ffc1a1deabdad6688ead1a72f5ac95.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、分區(qū)c的第 頁Linux動態(tài)鏈接庫.so文件的創(chuàng)建與使用2011年4月19日10:57Linux動態(tài)鏈接庫.so文件的創(chuàng)建與使用大家都知道,在WINDOWS系統(tǒng)中有很多的動態(tài)鏈接庫(以.DLL為后綴的文件,DLL即DynamicLinkLibrary)。這種動態(tài)鏈接庫,和靜態(tài)函數(shù)庫不同,它里面的函數(shù)并不是執(zhí)行程序本身的一部分,而是根據(jù)執(zhí)行程序需要按需裝入,同時其執(zhí)行代碼可在多個執(zhí)行程序間共享,節(jié)省了空間,提高了效率,具備很高的靈活性,得到越來越多程序員和用戶的青睞。那么,在LINUX系統(tǒng)中有無這樣的函數(shù)庫呢?答案是肯定的,LINUX的動態(tài)鏈接庫不僅有,而且為數(shù)不少。在/lib目錄下,就有許多以
2、.so作后綴的文件,這就是LINUX系統(tǒng)應用的動態(tài)鏈接庫,只不過與WINDOWS叫法不同,它叫so,即SharedObject,共享對象。(在LINUX下,靜態(tài)函數(shù)庫是以.a作后綴的),X-WIND0W作為LINUX下的標準圖形窗口界面,它本身就采用了很多的動態(tài)鏈接庫(在/usr/XllR6/lib目錄下),以方便程序間的共享,節(jié)省占用空間。著名的APACHE網(wǎng)頁服務器,也采用了動態(tài)鏈接庫,以便擴充程序功能。你只需將PHP動態(tài)鏈接庫拷到其共享目錄,修改一下配置,APACHE就可以支持PHP網(wǎng)頁了。如果你愿意,可以自己編寫動態(tài)鏈接庫,讓APACHE支持你自己定義的網(wǎng)頁格式。這就是動態(tài)鏈接的好處。
3、1、LINUX下動態(tài)鏈接庫的創(chuàng)建在LINUX系統(tǒng)下,創(chuàng)建動態(tài)鏈接庫是件再簡單不過的事情。只要在編譯函數(shù)庫源程序時加上-shared選項即可,這樣所生成的執(zhí)行程序即為動態(tài)鏈接庫。從某種意義上來說,動態(tài)鏈接庫也是一種執(zhí)行程序。按一般規(guī)則,程序名應帶.so后綴。下面舉個例子說說。我準備編寫兩個函數(shù),一個用于查詢當前日期getdate,個用于查詢當前時間gettime,并將這兩個函數(shù)存于動態(tài)鏈接庫my.s。中。為此,需要做以下幾項工作。1.1編寫用戶接口文件datetime.h,內(nèi)容如下(每行前面的數(shù)字為行號):/*datetime.h:縱橫軟件制作中心雨亦奇編寫,2001-06-28.*/2#ifn
4、def_DATETIME_H4#define_DATETIME_H6/*日期結(jié)構(gòu)*/typedefstructintyear;intmon;intday;DATETYPE;14/*時間結(jié)構(gòu)*/typedefstructcharhour;charmin;charsec;TIMETYPE;22/*函數(shù)原型說明*/24#ifdefSHAREDint(*getdate)(DATETYPE*d);26int(*getdate)(DATETYPE*d);27#else28intgetdate(DATETYPE*d);29#endif3031#ifdefSHARED32int(*gettime)(TIMET
5、YPE*t);33#else34intgettime(TIMETYPE*t);35#endif3637#endif38這個用戶接口文件中,先定義了日期與時間結(jié)構(gòu),接著定義一下函數(shù)的原型。動態(tài)函數(shù)與靜態(tài)函數(shù)的原型說明不冋的是,動態(tài)函數(shù)應使用(*函數(shù)名)的形式,以便引用其指針。若要引用文件中的動態(tài)函數(shù)說明,用戶應該定義一下SHARED宏,這樣才能使用。1.2編寫getdate.c,源程序如下:1/*getdate.c:縱橫軟件制作中心雨亦奇編寫,2001-06-28.*/23#includetime.h4#includedatetime.h56intgetdate(DATETYPE*d)78lon
6、gti;9structtm*tm;1011time(&ti);19十m二1cca1十ma十彳)13d-year=tm-tmyear+1900;14d-mon=tm-tmmon+1;丄ZCZXXX丄丄1/XXX/1/XXXXXX丄丄丄,15d-day=tm-tmmday;丄vX/vXexyL/Xxx/L/Xxxmvxexy,1617在getdate函數(shù)中,先調(diào)用time取得以秒計的系統(tǒng)時間,再用localtime函數(shù)轉(zhuǎn)換一下時間結(jié)構(gòu),最后調(diào)整得到正確的日期。1.3編寫gettime.c,源程序如下:/*gettime.c:縱橫軟件制作中心雨亦奇編寫,2001-06-28.*/2#includet
7、ime.h#includedatetime.h5intgettime(TIMETYPE*t)longti;structtm*tm;10time(&ti);tm=localtime(&ti);t-hour二tm-tm_hour;t-min二tm-tm_min;t-min二tmtm_min;tsec二tmtm_sec;17gettime函數(shù)與getdate函數(shù)相仿,先用time函數(shù)取得以秒計的系統(tǒng)時間,再用localtime函數(shù)轉(zhuǎn)換一卜時間結(jié)構(gòu),最后返回當前的時間(不需調(diào)整)。1.4編與維護文件makefile-lib,內(nèi)容如下:1#makefile-lib:縱橫軟件制作中心雨亦奇編寫,2001-
8、06-28.23all:my.so45SRC=getdate.cgettime.c67TGT=$(SRC:.c=.o)89$(SRC):datetime.h10touch$1112%.o:%.c13cc-c$?1415#動態(tài)函數(shù)庫(my.so)生成16my.so:$(TGT)17cc-shared-o$(TGT)18編寫維護文件的目的,在于方便程序員維護程序,尤其是維護比較大的工程項目。一個素質(zhì)良好的程序員應該學會熟練地編寫維護文件makefile。定義了文件間的依賴關系后,一旦源文件發(fā)生變化,僅需make一下,其目標文件維護代碼會自動執(zhí)行,從而自動更新目標文件,減少了許多工作量。注意:每行維
9、護代碼必須以TAB(跳格鍵)開始,不是的話make時將出錯。本維護文件第1行是注釋行,以#號開頭;文件第3行定義所有需要維護的函數(shù)庫;第5行定義相關源程序文件;第7行定義目標文件;第9-10行說明所有源程序依賴于datetime.h頭文件,并有相應維護代碼,即touch下,更新一下源文件的時間;第12-13行定義.0文件依賴于相應的.c文件,并指定了維護代碼,即用cc編譯一下;第16-17行定義共享庫my.so依賴的目標文件,維護代碼中用-shared編譯選項,以生成動態(tài)鏈接庫my.so。1.5運行make-fmakefile-lib命令make運行后,動態(tài)鏈接庫my.so就產(chǎn)生了,我們就可以
10、在程序中調(diào)用了。如果想讓系統(tǒng)所有用戶都可以使用,則應以root用戶登錄系統(tǒng),將這個庫拷貝到/lib目錄下(命令:cpmy.so/lib),或者在/lib目錄下建個符號連接即可(命令:ln-spwd/my.so/lib)。2、LINUX下動態(tài)鏈接庫的使用2.1重要的dlfcn.h頭文件LINUX下使用動態(tài)鏈接庫,源程序需要包含dlfcn.h頭文件,此文件定義了調(diào)用動態(tài)鏈接庫的函數(shù)的原型。下面詳細說明一下這些函數(shù)。dlerror原型為:constchar*dlerror(void);當動態(tài)鏈接庫操作函數(shù)執(zhí)行失敗時,dlerror可以返回出錯信息,返回值為NULL時表示操作函數(shù)執(zhí)行成功。dlopen
11、原型為:void*dlopen(constchar*filename,intflag);dlopen用于打開指定名字(filename)的動態(tài)鏈接庫,并返回操作句柄。filename:如果名字不以/開頭,則非絕對路徑名,將按下列先后順序查找該文件。filename:如果名字不以/開頭,則非絕對路徑名,將按下列先后順序查找該文件。用戶環(huán)境變量中的LD_LIBRARY值;動態(tài)鏈接緩沖文件/etc/ld.so.cache目錄/lib,/usr/libflag表示在什么時候解決未定義的符號(調(diào)用)。取值有兩個:RTLD_LAZY:表明在動態(tài)鏈接庫的函數(shù)代碼執(zhí)行時解決。RTLD_N0W:表明在dlope
12、n返回前就解決所有未定義的符號,一旦未解決,dlopen將返回錯誤。dlopen調(diào)用失敗時,將返回NULL值,否則返回的是操作句柄。dlsym:取函數(shù)執(zhí)行地址原型為:void*dlsym(void*handle,char*symbol);dlsym根據(jù)動態(tài)鏈接庫操作句柄(handle)與符號(symbol),返回符號對應的函數(shù)的執(zhí)行代碼地址。由此地址,可以帶參數(shù)執(zhí)行相應的函數(shù)。如程序代碼:void(*add)(intx,inty);/*說明一下要調(diào)用的動態(tài)函數(shù)add*/add二dlsym(xxx.so,add);/*打開xxx.so共享庫,取add函數(shù)地址*/add(89,369);/*帶兩個
13、參數(shù)89和369調(diào)用add函數(shù)*/dlclose:關閉動態(tài)鏈接庫原型為:intdlclose(void*handle);dlclose用于關閉指定句柄的動態(tài)鏈接庫,只有當此動態(tài)鏈接庫的使用計數(shù)為0時,才會真正被系統(tǒng)卸載。2.2在程序中使用動態(tài)鏈接庫函數(shù)2.2.1程序范例下面的程序裝載了動態(tài)鏈接庫my.so,并用getdate,gettime取得當前日期與時間后輸出。/*文件名稱:dy.c*/*功能描述:動態(tài)鏈接庫應用示范程序*/*程序編寫:縱橫軟件制作中心雨亦奇*/*編寫時間:2001-06-28*/XTXT/7#includestdio.h/*包含標準輸入輸出文件*/9#includedlf
14、cn.h/*包含動態(tài)鏈接功能接口文件*/#defineSOFILE./my.so/*指定動態(tài)鏈接庫名稱*/12#defineSHARED/*定義宏,確認共享,以便引用動態(tài)函數(shù)*/#includedatetime.h/*包含用戶接口文件*/15main()DATETYPEd;TIMETYPEt;void*dp;char*error;22puts(動態(tài)鏈接庫應用示范);24dp=dlopen(SOFILE,RTLD_LAZY);/*打開動態(tài)鏈接庫*/26辻(dp=NULL)/*若打開失敗則退出*/TOC o 1-5 h zfputs(dlerror(),stderr);exit(1);32getd
15、ate=dlsym(dp,getdate);/*定位取日期函數(shù)*/33getdate=dlsym(dp,getdate);/*定位取日期函數(shù)*/34error=dlerror();/*檢測錯誤*/if(error)/*若出錯則退出*/fputs(error,stderr);exit(1);4142getdate(&d);/*調(diào)用此共享函數(shù)*/printf(當前日期:04d-%02d-%02dn,d.year,d.mon,d.day);44gettime=dlsym(dp,gettime);/*定位取時間函數(shù)*/46error=dlerror();/*檢測錯誤*/if(error)/*若出錯則退
16、出*/fputs(error,stderr);exit(1);53gettime(&t);/*調(diào)用此共享函數(shù)*/printf(當前時間:02d:%02d:%02dn,t.hour,t.min,t.sec);56dlclose(dp);/*關閉共享庫*/58exit(0);/*成功返回*/6061程序說明:第8行:包含標準輸入輸出頭文件,因為程序中使用了printf,puts,fputs等標準輸入輸出函數(shù),需要讓編譯器根據(jù)頭文件中函數(shù)的原型,檢查一下語法;第10-11行:包含動態(tài)鏈接庫功能頭文件,并定義動態(tài)鏈接庫名稱;第13T4行:定義宏SHARED以便引用14行的頭文件datetime.h中的
17、動態(tài)函數(shù)說明;第25行:用dlopen打開S0FILE共享庫,返回句柄dp;第27-31行:檢測dp是否為空,為空則顯示錯誤后退出;第33行:用dlsym取得getdate函數(shù)動態(tài)地址;第35-40行:如果dlerror返回值不為空,貝Jdlsym執(zhí)行出錯,程序顯示錯誤后退出;第42-43行:執(zhí)行getdate調(diào)用,輸出當前日期;第45行:用dlsym取得gettime函數(shù)動態(tài)地址;第47-52行:如果dlerror返回值不為空,貝Jdlsym執(zhí)行出錯,程序顯示錯誤后退出;第54-55行:執(zhí)行gettime調(diào)用,輸出當前時間;第57行:用dlclose關閉dp所指示的動態(tài)鏈接庫;第59行:程序
18、退出,返回0值。2.2.2編寫維護文件維護文件makefile內(nèi)容如下:#makefile:縱橫軟件制作中心雨亦奇編寫,2001-06-28.2all:dy4DYSRC=dy.c6DYTGT=$(DYSRC:.c=.o)88分區(qū)c的第 頁%.o:%.ccc-c$?11#動態(tài)庫應用示范程序dy:$(DYTGT)cc-rdynamic-s-o$(DYTGT)-ldl維護文件說明:第3行:定義所有需要維護的模塊;第5行:定義源程序;第7行:定義目標文件;第9-10行:定義.0文件依賴于.c文件,維護代碼為“cc-c變動的源文件名”;第13-14行:定義dy依賴于變量DYTGT指示的值,維護代碼中采用-rdynamic選項以指定輸出文件為動態(tài)鏈接的方式,選項-s指定刪除目標文件中的符號表,最后的選項-ldl則指示裝配程序ld需要裝載dl函數(shù)庫。2.2.3運行make命令運行make后將產(chǎn)生執(zhí)行文件dy,運行后將產(chǎn)生如下類似信息:動態(tài)鏈接庫應用示范當前日期:2001-06-
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年實木大班桌項目可行性研究報告
- 2025年固定式氣體檢測變送器項目可行性研究報告
- 2025至2030年蘆薈洗面霜項目投資價值分析報告
- 2025至2030年混紡駝色賓館毯項目投資價值分析報告
- 2025至2030年多功能壓線頭項目投資價值分析報告
- 2025-2030全球牛血清白蛋白(BSA)檢測試劑盒行業(yè)調(diào)研及趨勢分析報告
- 2025-2030全球工業(yè)用氣凝膠行業(yè)調(diào)研及趨勢分析報告
- 2025年全球及中國汽車換檔聯(lián)鎖電纜行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報告
- 二零二五年度文化創(chuàng)意產(chǎn)業(yè)聘用合同(設計研發(fā))
- 水上寵物運輸協(xié)議
- 個人安全與社會責任的基本知識概述
- 建筑裝飾工程計量與計價試題一及答案
- 簡易勞務合同電子版
- 明代文學緒論
- 通用稅務自查情況說明報告(7篇)
- 體育賽事的策劃、組織與實施 體育賽事利益相關者
- 分析化學(高職)PPT完整版全套教學課件
- 晚熟的人(莫言諾獎后首部作品)
- m拱頂儲罐設計計算書
- 2023外貿(mào)業(yè)務協(xié)調(diào)期中試卷
- 新人教鄂教版(2017)五年級下冊科學全冊教學課件
評論
0/150
提交評論