国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Linux > 正文

Linux系統中靜態庫和動態庫的生成和使用

2024-06-28 13:03:06
字體:
來源:轉載
供稿:網友
 

一、靜態庫的創建和使用:

1、生成靜態庫 :庫名 libmylib.a

ar rcs libmylib.a mylib.o

2、將靜態庫copy到 /usr/lib/ 或/lib/ 目錄下

cp libmylib.a /usr/lib/

3、靜態庫的使用

比如測試文件為test.c

gcc -0 test test.c -lmylib

-l為選項, mylib為庫名。mylib為libmylib的中間部分,linux下約定所有庫都以前綴lib開始

靜態庫以.a結尾,動態庫以.so結尾。再編譯程式時,無需帶上前綴和后綴。

注意:靜態庫的命名需要以"lib"開頭,否者連接是編譯器無法找到庫

二、動態庫的創建和使用:

1、下面命令把mylib.c程序創建成了一個動態庫

(1)、gcc -fPIC -o mylib.o -c mylib.c

(2)、gcc -shared -o libttt.so mylib.o

也可以直接使用一條命令

gcc -fPIC -shared -o libttt.so mylib.c

2、Linux有兩種方式調用動態庫連接中的函數

(1)、gcc -o test test.c ./libttt.so

(2)、cp libttt.so /usr/lib/libttt.so

gcc -o test test.c /usr/lib/libttt.so

注意:引用動態庫時,必須含有路徑,如果只是使用libttt.so,則必須確保這個庫所在目錄包括再PATH 環境變量中

三、系統函數使用動態庫:

1、void *dlopen(const char *filename, int flag)

用于打開指定名字的動態鏈接庫,并返回一個句柄

flag:RTLD_LAZY, RTLD_NEW, RTLD_GLOBAL

RTLD_LAZY:在dlopen()返回前,對于動態庫中存在的未定義的變量(如外部變extern,也可以是函數)

不執行解析,也就是不解析這個變量的地址

RTLD_NEW:與RTLD_LAZY 不同,在dlopen()返回前,解析處每個未定義的變量的地址,如果解析不出來,dlopen會返回NULL,錯位為"undefined symbol:xxx..."

RTLD_GLOBAL:是庫中被解析出來的變量在隨后的其它鏈接庫中也可以使用,即全局有效。

2、void *dlsym(void *handle, char *symbol)

根據動態鏈接庫的句柄與函數名,返回函數名對應的函數的地址。

3、int dlclose(void *handle)

關閉動態鏈接庫,handle是調用dlopen函數庫的句柄

4、const char *dlerror(void)

動態庫鏈接庫執行失敗時,dlerror返回錯誤信息,若執行成功,則返回NULL

例子:

main.cint main(void){void *handle;char *error;void (*welcome)();if ((handle = dlopen("./libttt.so", RTLD_LAZY)) == NULL){PRintf("dlopen error/n");return -1;}welcome = dlsym(handle, "welcome");if ((error = dlerror()) != NULL){printf("dlsym error/n");return -1;}welcome();dlclose(handle);return 0;}gcc -ldl -o main main.c

-ldl 指明dlopen函數所在的庫。

注意:dlopen("./libttt.so", RTLD_LAZY),的目錄是在當前目錄下,如果不在當前目錄下,程序運行錯誤

共享庫進行更新或安裝新庫后,必須運行ldconfig命令更新/etc/ld.conf文件中相應的項

如果使用RPM進行安裝,一般會自動進行更新,不過也不能保證這一點。

使用數學庫時加上 -lm

gcc -lm

庫工具使用:

ldd 工具

ldd 用來顯示執行文件需要哪些共享庫, 共享庫裝載管理器在哪里找到了需要的共享庫。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 田林县| 仙居县| 沐川县| 黎城县| 徐州市| 莫力| 那曲县| 南岸区| 巴彦县| 宝兴县| 凤冈县| 南京市| 资源县| 象州县| 汶上县| 铜鼓县| 新乡市| 昭平县| 连平县| 庄浪县| 温宿县| 保定市| 都兰县| 临泉县| 读书| 嵩明县| 松溪县| 丁青县| 垣曲县| 长岭县| 香港 | 益阳市| 大厂| 九江市| 平塘县| 新密市| 甘南县| 南充市| 鲜城| 嘉鱼县| 昌图县|