Linux下共享庫的製作與使用

2021-04-16 02:14:00 字數 2778 閱讀 5293

linux下共享庫的製作與使用

還是使用上面的例子程式:

生成共享庫(動態鏈結庫):

#>gcc  -fpic -shared -o libstr.so  strlen.c strnlen.c

-fpic

使輸出的物件模組是按照可重定位位址方式生成的。

-shared

指定把對應的原始檔生成對應的動態鏈結庫檔案

libstr.so

檔案。

動態庫的使用:

動態庫的分為隱式呼叫和顯式呼叫兩種呼叫方法:

隱式呼叫的使用使用方法和靜態庫的呼叫差不多,具體方法如下:

#>gcc -c -i/home/hcj/******xx main.c

#>gcc -o main1 -l/home/hcj/******xx main.o libstr.so  //

這裡是*.so

在這種呼叫方式中,需要維護動態鏈結庫的配置檔案

/etc/ld.so.conf

來讓動態鏈結庫為系統所使用,通常將動態鏈結庫所在目錄名追加到動態鏈結庫配置檔案中。否則在執行相關的可執行檔案的時候就會出現載入動態鏈結庫失敗的現象。在編譯所引用的動態庫時,可以在

gcc採用–l或

-l選項或直接引用所需的動態鏈結庫方式進行編譯。在

linux

裡面,可以採用

ldd命令來檢查程式依賴共享庫。不過我沒有隱式呼叫成功過,因為在

cygwin

中沒有找到

/etc/ld.so.conf

,很奇怪。

顯式呼叫:

/*****************************************

filename: main2.c

description: test static/dynamic library

author: hcj

date  : 2005-5-7

******************************************/

#include

#include

int main(int argc, char* argv)

;unsigned long ullength = 0;

void *pdlhandle;

char *pszerr;

pdlhandle = dlopen("./libstr.so", rtld_lazy);  //

載入鏈結庫

/libstr.so

if(!pdlhandle)

pszerr = dlerror();

if(pszerr != null)

//get function from lib

pstrlenfun = dlsym(pdlhandle, "strlen"); //

獲取函式的位址

pszerr = dlerror();

if(pszerr != null)

pstrnlenfun = dlsym(pdlhandle, "strnlen");

pszerr = dlerror();

if(pszerr != null)

printf("the string is : %s/n", str);

ullength = pstrlenfun(str);   //

呼叫相關的函式

printf("the string length is : %d(use strlen)/n", ullength);

ullength = pstrnlenfun(str, 10);

printf("the string length is : %d(use strnlen)/n", ullength);

dlclose(pdlhandle);

return 0;}

#>gcc -o mian2 -ldl main2.c

用gcc

編譯對應的原始檔生成可執行檔案,

-ldl

選項,表示生成的物件模組需要使用共享庫。執行對應得檔案同樣可以得到正確的結果。

(1)dlopen()

第乙個引數:指定共享庫的名稱,將會在下面位置查詢指定的共享庫。

-環境變數

ld_library_path

列出的用分號間隔的所有目錄。

-檔案/etc/ld.so.cache

中找到的庫的列表,用

ldconfig

維護。-目錄

usr/lib

。-目錄

/lib

。-當前目錄。

第二個引數:指定如何開啟共享庫。

-rtld_now

:將共享庫中的所有函式載入到記憶體

-rtld_lazy

:會推後共享庫中的函式的載入操作,直到呼叫

dlsym()

時方載入某函式

(2)dlsym()

呼叫dlsym

時,利用

dlopen()

返回的共享庫的

phandle

以及函式名稱作為引數,返回要載入函式的入口位址。

(3)dlerror()

該函式用於檢查呼叫共享庫的相關函式出現的錯誤。

這樣我們就用簡單的例子說明了在

linux

下靜態/

動態庫的建立

Linux下共享庫的製作與使用

生成共享庫 動態鏈結庫 gcc fpic shared o libstr.so strlen.c strnlen.c fpic 使輸出的物件模組是按照可重定位位址方式生成的。shared 指定把對應的原始檔生成對應的動態鏈結庫檔案 libstr.so 檔案。動態庫的使用 動態庫的分為隱式呼叫和顯式呼...

Linux下共享庫的製作與使用 z

生成共享庫 動態鏈結庫 gcc fpic shared o libstr.so strlen.c strnlen.c fpic 使輸出的物件模組是按照可重定位位址方式生成的。shared 指定把對應的原始檔生成對應的動態鏈結庫檔案 libstr.so 檔案。動態庫的使用 動態庫的分為隱式呼叫和顯式呼...

Linux下靜態庫與動態庫的製作和使用

1 linux作業系統支援的函式庫分為靜態庫和動態庫,動態庫又稱為共享庫。函式庫檔案主要存放在 lib usr lib 2 不管是靜態函式庫還是動態函式庫,都是由 o目標檔案生成 這類庫檔案以lib a 利用靜態函式庫編譯成的檔案較大,因為整個庫的所有資料都會被整合到目標 中。優點 編譯後的程式不需...