動態庫的建立與呼叫

2021-09-18 07:17:33 字數 1764 閱讀 2332

動態庫的建立:

先建立乙個目錄用來後續操作:

編譯:命令:gcc 原始檔 -fpic –shared –o 目標檔案

原始檔只.c檔案,當工程檔案數目較少(只有乙個)時,便可直接編譯

目標檔案指最終生成的動態庫檔案,一般字尾為.so

當工程檔案數目較多時,可使用makefile來編譯

makefile檔案:

至此,動態庫建立成功!

呼叫動態庫:

設計測試main.c來測試庫中的函式

使用命令gcc main.c –l. –lcalculate可直接生成a.out

-l.:-l引數用來指定庫的位置,.表示當前路徑

-l(小寫字母l):表示要鏈結的庫,-l後直接寫庫名就行,不需要字首和字尾(比如-lcalculate表示鏈結的庫為libcalculate.so)

在編譯程式時,使用動態鏈結庫和靜態庫是一致的,使用「-l庫名」的方式,在生成可執行檔案的時候會鏈結庫檔案。

命令:gcc –o maintest main.c –l ./ -lcalcualte

maintest:生成的可執行檔案(自己命名)

-l:-l引數用來指定庫的位置 此引數之後的./即表示當前路徑

-l(小寫字母l):表示要鏈結的庫,-l後直接寫庫名就行,不需要字首和字尾(比如-lcalculate表示鏈結的庫為libcalculate.so)

*鏈結動態庫的位置必須正確!!

動態呼叫動態庫:

linux提供dlopen()、dlsym()、dlclose()、dlerror()函式來獲取動態鏈結庫的函式。

dlopen()函式的使用示例為:

void *dlopen(const char* filename,int flags);

其中引數flags的取值有三個,rtld_lazy、rtld_now和rtld_global,其中rtld_lazy表示動態庫中存在的未定義的變數,不執行解析,即暫緩決定,等有需要時再解出符號;rtld_now表示動態庫中存在的未定義的變數,執行解析,即立即決定,返回前解出所有的未決定的符號;rtld_global使得動態庫中的解析的定義變數在隨後的其他的鏈結庫中變得可以使用。

dlsym()函式:取函式執行位址,原型為:void *dlsym(void* handle,char* symbol);此函式根據動態鏈結庫操作控制代碼(handle)與符號(symbol),返回符號對應的函式的執行**位址。

如何建立與呼叫動態鏈結庫

靜態鏈結庫與動態鏈結庫區別 靜態鏈結庫 lib中的指令被直接包含在最終生成的exe檔案中。動態鏈結庫 dll不必被包含在最終的exe中,exe檔案執行時可以動態地引用和解除安裝dll檔案。同時,靜態鏈結庫中不能再包含其他的動態鏈結庫或靜態庫,而動態鏈結庫中可以包含其他的動態或靜態庫。vc 支援的dl...

靜態庫動態庫的建立和呼叫

靜態庫的建立 靜態庫字尾通常以.a結尾,鏈結生成靜態庫時需要使用ar命令。常用引數 r 在庫中插入 修改 模組 替換靜態庫 當插入的模組名已經在庫中存在,則替換同名的模組,如若干模組中有乙個模組在庫中不存在,則ar顯示乙個 錯誤資訊,並且不會替換其他同名模組 c 建立乙個新的庫。不管庫是否存在,都將...

C 呼叫C 建立的動態庫

系統 win10 開發工具 vs2015 啟動vs2015 檔案 新建 專案,按下圖進行選擇填寫,選擇win32控制台應用程式或win32專案都可以,這兩相都會彈出相同的建立視窗。在win32應用程式嚮導對話方塊中選擇 下一步 按下圖進行勾選 匯出符號作用 生成的 中會自動包含乙個匯出變數 乙個匯出...