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

1、靜態庫的建立和使用:linux

 

一、生成靜態庫 :庫名 libmylib.a函數

ar rcs libmylib.a mylib.o工具

二、將靜態庫copy到 /usr/lib/ 或/lib/ 目錄下測試

cp libmylib.a /usr/lib/spa

三、靜態庫的使用code

好比測試文件爲test.corm

gcc -0 test test.c -lmylibci

-l爲選項, mylib爲庫名。mylib爲libmylib的中間部分,Linux下約定全部庫都之前綴lib開始get

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

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

 

2、動態庫的建立和使用:

 

一、下面命令把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

 

二、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 環境變量中

 

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

 

一、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:是庫中被解析出來的變量在隨後的其它連接庫中也可使用,即全局有效。

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

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

三、int dlclose(void *handle)

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

四、const char *dlerror(void)

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

 

例子:

 

 

main.c
int main(void)
{
void *handle;
char *error;
void (*welcome)();

if ((handle = dlopen("./libttt.so", RTLD_LAZY)) == NULL)
{
printf("dlopen error
");
return -1;
}

welcome = dlsym(handle, "welcome");
if ((error = dlerror()) != NULL)
{
printf("dlsym error
");
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 用來顯示執行文件須要哪些共享庫, 共享庫裝載管理器在哪裏找到了須要的共享庫。

nm [-D] 命令查看動態庫中的函數 D參數爲可被外部調用的動態函數

相關文章
相關標籤/搜索