linux建立动态库链接,Linux动态链接库.so文件的创建与使用
資料出處:http://linux.chinaitlab.com/administer/803560.html
編 寫維護(hù)文件的目的,在于方便程序員維護(hù)程序,尤其是維護(hù)比較大的工程項(xiàng)目。一個(gè)素質(zhì)良好的程序員應(yīng)該學(xué)會(huì)熟練地編寫維護(hù)文件makefile。定義了文件 間的依賴關(guān)系后,一旦源文件發(fā)生變化,僅需make一下,其目標(biāo)文件維護(hù)代碼會(huì)自動(dòng)執(zhí)行,從而自動(dòng)更新目標(biāo)文件,減少了許多工作量。注意: 每行維護(hù)代碼必須以TAB(跳格鍵)開始,不是的話make時(shí)將出錯(cuò)。
本維護(hù)文件第1行是注釋行,以#號(hào)開頭;文件第3行定義所有需要維護(hù)的 函數(shù)庫(kù);第5行定義相關(guān)源程序文件;第7行定義目標(biāo)文件;第9-10行說(shuō)明所有源程序依賴于datetime.h頭文件,并有相應(yīng)維護(hù)代碼,即touch 一下,更新一下源文件的時(shí)間;第12-13行定義.o文件依賴于相應(yīng)的.c文件,并指定了維護(hù)代碼,即用cc編譯一下;第16-17行定義共享庫(kù) my.so依賴的目標(biāo)文件,維護(hù)代碼中用-shared編譯選項(xiàng),以生成動(dòng)態(tài)鏈接庫(kù)my.so。
1.5 運(yùn)行make -f makefile-lib 命令
make 運(yùn)行后,動(dòng)態(tài)鏈接庫(kù)my.so就產(chǎn)生了,我們就可以在程序中調(diào)用了。如果想讓系統(tǒng)所有用戶都可以使用,則應(yīng)以root用戶登錄系統(tǒng),將這個(gè)庫(kù)拷貝到 /lib目錄下(命令:cp my.so /lib),或者在/lib目錄下建個(gè)符號(hào)連接即可(命令:ln -s `pwd`/my.so /lib)。
2、LINUX下動(dòng)態(tài)鏈接庫(kù)的使用
2.1 重要的dlfcn.h頭文件
LINUX下使用動(dòng)態(tài)鏈接庫(kù),源程序需要包含dlfcn.h頭文件,此文件定義了調(diào)用動(dòng)態(tài)鏈接庫(kù)的函數(shù)的原型。下面詳細(xì)說(shuō)明一下這些函數(shù)。
2.1.1 dlerror
原型為: const char *dlerror(void);
當(dāng)動(dòng)態(tài)鏈接庫(kù)操作函數(shù)執(zhí)行失敗時(shí),dlerror可以返回出錯(cuò)信息,返回值為NULL時(shí)表示操作函數(shù)執(zhí)行成功。
2.1.2 dlopen
原型為: void *dlopen (const char *filename, int flag);
dlopen用于打開指定名字(filename)的動(dòng)態(tài)鏈接庫(kù),并返回操作句柄。
filename: 如果名字不以/開頭,則非絕對(duì)路徑名,將按下列先后順序查找該文件。
(1) 用戶環(huán)境變量中的LD_LIBRARY值;
(2) 動(dòng)態(tài)鏈接緩沖文件/etc/ld.so.cache
(3) 目錄/lib,/usr/lib
flag表示在什么時(shí)候解決未定義的符號(hào)(調(diào)用)。取值有兩個(gè):
1) RTLD_LAZY : 表明在動(dòng)態(tài)鏈接庫(kù)的函數(shù)代碼執(zhí)行時(shí)解決。
2) RTLD_NOW : 表明在dlopen返回前就解決所有未定義的符號(hào),一旦未解決,dlopen將返回錯(cuò)誤。
dlopen調(diào)用失敗時(shí),將返回NULL值,否則返回的是操作句柄。
2.1.3 dlsym : 取函數(shù)執(zhí)行地址
原型為: void *dlsym(void *handle, char *symbol);
dlsym根據(jù)動(dòng)態(tài)鏈接庫(kù)操作句柄(handle)與符號(hào)(symbol),返回符號(hào)對(duì)應(yīng)的函數(shù)的執(zhí)行代碼地址。由此地址,可以帶參數(shù)執(zhí)行相應(yīng)的函數(shù)。
如程序代碼: void (*add)(int x,int y); /* 說(shuō)明一下要調(diào)用的動(dòng)態(tài)函數(shù)add */
add=dlsym("xxx.so","add"); /* 打開xxx.so共享庫(kù),取add函數(shù)地址 */
add(89,369); /* 帶兩個(gè)參數(shù)89和369調(diào)用add函數(shù) */
2.1.4 dlclose : 關(guān)閉動(dòng)態(tài)鏈接庫(kù)
原型為: int dlclose (void *handle);
dlclose用于關(guān)閉指定句柄的動(dòng)態(tài)鏈接庫(kù),只有當(dāng)此動(dòng)態(tài)鏈接庫(kù)的使用計(jì)數(shù)為0時(shí),才會(huì)真正被系統(tǒng)卸載。
2.2 在程序中使用動(dòng)態(tài)鏈接庫(kù)函數(shù)
2.2.1 程序范例
下面的程序裝載了動(dòng)態(tài)鏈接庫(kù)my.so,并用getdate,gettime取得當(dāng)前日期與時(shí)間后輸出。
----------------------------------------------------------------------
1 /************************************/
2 /* 文件名稱: dy.c */
3 /* 功能描述: 動(dòng)態(tài)鏈接庫(kù)應(yīng)用示范程序 */
4 /* 程序編寫: 縱橫軟件制作中心雨亦奇 */
5 /* 編寫時(shí)間: 2001-06-28 */
6 /************************************/
7
8 #include "stdio.h" /* 包含標(biāo)準(zhǔn)輸入輸出文件 */
9
10 #include "dlfcn.h" /* 包含動(dòng)態(tài)鏈接功能接口文件 */
11 #define SOFILE "./my.so" /* 指定動(dòng)態(tài)鏈接庫(kù)名稱 */
12
13 #define SHARED /* 定義宏,確認(rèn)共享,以便引用動(dòng)態(tài)函數(shù) */
14 #include "datetime.h" /* 包含用戶接口文件 */
15
16 main()
17 {
18 DATETYPE d;
19 TIMETYPE t;
20 void *dp;
21 char *error;
22
23 puts("動(dòng)態(tài)鏈接庫(kù)應(yīng)用示范");
24
25 dp=dlopen(SOFILE,RTLD_LAZY); /* 打開動(dòng)態(tài)鏈接庫(kù) */
26
27 if (dp==NULL) /* 若打開失敗則退出 */
28 {
29 fputs(dlerror(),stderr);
30 exit(1);
31 }
32
33 getdate=dlsym(dp,"getdate"); /* 定位取日期函數(shù) */
34
35 error=dlerror(); /* 檢測(cè)錯(cuò)誤 */
36 if (error) /* 若出錯(cuò)則退出 */
37 {
38 fputs(error,stderr);
39 exit(1);
40 }
41
42 getdate(&d); /* 調(diào)用此共享函數(shù) */
43 printf("當(dāng)前日期: %04d-%02d-%02d\n",d.year,d.mon,d.day);
44
45 gettime=dlsym(dp,"gettime"); /* 定位取時(shí)間函數(shù) */
46
47 error=dlerror(); /* 檢測(cè)錯(cuò)誤 */
48 if (error) /* 若出錯(cuò)則退出 */
49 {
50 fputs(error,stderr);
51 exit(1);
52 }
53
54 gettime(&t); /* 調(diào)用此共享函數(shù) */
55 printf("當(dāng)前時(shí)間: %02d:%02d:%02d\n",t.hour,t.min,t.sec);
56
57 dlclose(dp); /* 關(guān)閉共享庫(kù) */
58
59 exit(0); /* 成功返回 */
60
61 }
總結(jié)
以上是生活随笔為你收集整理的linux建立动态库链接,Linux动态链接库.so文件的创建与使用的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: axi时序图_深入 AXI4总线(E3)
- 下一篇: android客户端cookies,an