日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux建立动态库链接,Linux动态链接库.so文件的创建与使用

發布時間:2024/7/23 linux 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux建立动态库链接,Linux动态链接库.so文件的创建与使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

資料出處:http://linux.chinaitlab.com/administer/803560.html

編 寫維護文件的目的,在于方便程序員維護程序,尤其是維護比較大的工程項目。一個素質良好的程序員應該學會熟練地編寫維護文件makefile。定義了文件 間的依賴關系后,一旦源文件發生變化,僅需make一下,其目標文件維護代碼會自動執行,從而自動更新目標文件,減少了許多工作量。注意: 每行維護代碼必須以TAB(跳格鍵)開始,不是的話make時將出錯。

本維護文件第1行是注釋行,以#號開頭;文件第3行定義所有需要維護的 函數庫;第5行定義相關源程序文件;第7行定義目標文件;第9-10行說明所有源程序依賴于datetime.h頭文件,并有相應維護代碼,即touch 一下,更新一下源文件的時間;第12-13行定義.o文件依賴于相應的.c文件,并指定了維護代碼,即用cc編譯一下;第16-17行定義共享庫 my.so依賴的目標文件,維護代碼中用-shared編譯選項,以生成動態鏈接庫my.so。

1.5 運行make -f makefile-lib 命令

make 運行后,動態鏈接庫my.so就產生了,我們就可以在程序中調用了。如果想讓系統所有用戶都可以使用,則應以root用戶登錄系統,將這個庫拷貝到 /lib目錄下(命令:cp my.so /lib),或者在/lib目錄下建個符號連接即可(命令:ln -s `pwd`/my.so /lib)。

2、LINUX下動態鏈接庫的使用

2.1 重要的dlfcn.h頭文件

LINUX下使用動態鏈接庫,源程序需要包含dlfcn.h頭文件,此文件定義了調用動態鏈接庫的函數的原型。下面詳細說明一下這些函數。

2.1.1 dlerror

原型為: const char *dlerror(void);

當動態鏈接庫操作函數執行失敗時,dlerror可以返回出錯信息,返回值為NULL時表示操作函數執行成功。

2.1.2 dlopen

原型為: void *dlopen (const char *filename, int flag);

dlopen用于打開指定名字(filename)的動態鏈接庫,并返回操作句柄。

filename: 如果名字不以/開頭,則非絕對路徑名,將按下列先后順序查找該文件。

(1) 用戶環境變量中的LD_LIBRARY值;

(2) 動態鏈接緩沖文件/etc/ld.so.cache

(3) 目錄/lib,/usr/lib

flag表示在什么時候解決未定義的符號(調用)。取值有兩個:

1) RTLD_LAZY : 表明在動態鏈接庫的函數代碼執行時解決。

2) RTLD_NOW : 表明在dlopen返回前就解決所有未定義的符號,一旦未解決,dlopen將返回錯誤。

dlopen調用失敗時,將返回NULL值,否則返回的是操作句柄。

2.1.3 dlsym : 取函數執行地址

原型為: void *dlsym(void *handle, char *symbol);

dlsym根據動態鏈接庫操作句柄(handle)與符號(symbol),返回符號對應的函數的執行代碼地址。由此地址,可以帶參數執行相應的函數。

如程序代碼: void (*add)(int x,int y); /* 說明一下要調用的動態函數add */

add=dlsym("xxx.so","add"); /* 打開xxx.so共享庫,取add函數地址 */

add(89,369); /* 帶兩個參數89和369調用add函數 */

2.1.4 dlclose : 關閉動態鏈接庫

原型為: int dlclose (void *handle);

dlclose用于關閉指定句柄的動態鏈接庫,只有當此動態鏈接庫的使用計數為0時,才會真正被系統卸載。

2.2 在程序中使用動態鏈接庫函數

2.2.1 程序范例

下面的程序裝載了動態鏈接庫my.so,并用getdate,gettime取得當前日期與時間后輸出。

----------------------------------------------------------------------

1 /************************************/

2 /* 文件名稱: dy.c */

3 /* 功能描述: 動態鏈接庫應用示范程序 */

4 /* 程序編寫: 縱橫軟件制作中心雨亦奇 */

5 /* 編寫時間: 2001-06-28 */

6 /************************************/

7

8 #include "stdio.h" /* 包含標準輸入輸出文件 */

9

10 #include "dlfcn.h" /* 包含動態鏈接功能接口文件 */

11 #define SOFILE "./my.so" /* 指定動態鏈接庫名稱 */

12

13 #define SHARED /* 定義宏,確認共享,以便引用動態函數 */

14 #include "datetime.h" /* 包含用戶接口文件 */

15

16 main()

17 {

18 DATETYPE d;

19 TIMETYPE t;

20 void *dp;

21 char *error;

22

23 puts("動態鏈接庫應用示范");

24

25 dp=dlopen(SOFILE,RTLD_LAZY); /* 打開動態鏈接庫 */

26

27 if (dp==NULL) /* 若打開失敗則退出 */

28 {

29 fputs(dlerror(),stderr);

30 exit(1);

31 }

32

33 getdate=dlsym(dp,"getdate"); /* 定位取日期函數 */

34

35 error=dlerror(); /* 檢測錯誤 */

36 if (error) /* 若出錯則退出 */

37 {

38 fputs(error,stderr);

39 exit(1);

40 }

41

42 getdate(&d); /* 調用此共享函數 */

43 printf("當前日期: %04d-%02d-%02d\n",d.year,d.mon,d.day);

44

45 gettime=dlsym(dp,"gettime"); /* 定位取時間函數 */

46

47 error=dlerror(); /* 檢測錯誤 */

48 if (error) /* 若出錯則退出 */

49 {

50 fputs(error,stderr);

51 exit(1);

52 }

53

54 gettime(&t); /* 調用此共享函數 */

55 printf("當前時間: %02d:%02d:%02d\n",t.hour,t.min,t.sec);

56

57 dlclose(dp); /* 關閉共享庫 */

58

59 exit(0); /* 成功返回 */

60

61 }

總結

以上是生活随笔為你收集整理的linux建立动态库链接,Linux动态链接库.so文件的创建与使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。