1
1.1共享庫的文件的生成和調用步驟
(1)共享庫文件的生成步驟
a.編寫源程序xxx.c,如:vi add.c
b.只編譯不鏈接生成xxx.o,如:
cc -c -fpic/*小模式*/add.c
c.生成共享庫文件
cc -shared 目標文件 -o lib庫名.so
cc -shared add.o -o libadd.so
(2)共享庫文件的使用步驟
a.編寫測試源程序xxx.c,如:vi mian.c
b.只編譯不鏈接生成目標文件xxx.c,如
cc -c main.c
c.鏈接測試文件和共享文件,方式有三種:
(1)直接鏈接
cc main.o libadd.so
(2)使用編譯選項進行鏈接
cc main.o -l add -L.
(3)配置環境變量LIBRARY_PATH:.
exPRot LIBRARY_PATH=$LIBRARY_PATH:.
cc main.o -l add
注意:
使用共享庫文件時,切記需要配置環境變量
export LD_LIBRARY_PATH$=LD_LIBRARY_PATH:.
上述指令用于解決運行時,加載不到共享庫的問題
擴展:
ls -l libadd.so
- rwx rxw r-w
文件類型 屬主權限 屬組權限 其他用戶權限
1 tarena tarena 6654
硬鏈接數 屬主名稱 屬組名稱 文件大小
12月 2 09:47 libadd.so
文件最后一次修改時間 文件名稱
其中文件的常見類型如下:
-表示普通規則文件
d表示目錄文件
其中文件的權限解析如下:
r讀權限 4
w寫權限 2
x執行權限 1
-沒有此權限 0
1.2共享庫的動態加載
(1)dlopen函數
#include <dlfcn.h>
void *dlopen(const char *filename, intflag);
第一個參數:常量字符串形式的文件名,共享庫文件名
第二個參數:標志位
RTLD_LAZY 延遲加載
RTLD_NOW 立即加載
返回值:
成功返回共享庫的句柄,失敗返回NULL
函數功能:
主要用于加載第一個參數指定的共享文件
注意:
在編譯鏈接時增加選項:-ldl
(2)dlsym函數
void* dlsym(void* handle, const char*symbol);
第一個參數:
共享庫句柄,dlopen函數的返回值
第二個參數:
字符串形式的符號,一般指定函數名
返回值:
成功返回符號在內存中的地址,失敗返回NULL
函數功能:
根據句柄和符號來查找symbol在內存中的地址
(3)dlclose函數
int dlclose(void* handle);
函數功能:
主要用與關閉參數指定的共享庫
返回值:
成功返回0,失敗返回非0
(4)dlerror函數
char *dlerror(void);
函數功能:
主要功能用于獲取dlopen()/dlsym()/dlclose()調用之后的最后一個錯誤信息,如果沒發生錯誤,則返回NULL
新聞熱點
疑難解答