-
靜態庫:
- 靜態庫在編譯時被鏈接到你的程序中,因此它們會成爲你程序的一部分。
- 這意味着當你運行你的程序時,靜態庫中的代碼已經被包含在你的程序中,因此你的程序可以獨立運行,不需要依賴外部庫文件。
- 靜態庫的一個缺點是,它會增加你程序的體積,因爲靜態庫中的代碼會被完整地複製到你的程序中。
-
動態庫:
- 動態庫在運行時加載到內存中,因此它們不會被包含在你的程序中。
- 當你運行程序時,操作系統會根據需要將動態庫加載到內存中,並且多個程序可以共享同一個動態庫的實例。
- 這意味着如果多個程序都使用相同的動態庫,它們可以節省內存,因爲動態庫只需要加載一次。
- 動態庫的一個缺點是,你的程序需要在運行時依賴這些庫文件,如果動態庫不存在或者無法加載,你的程序可能會崩潰或無法正常工作。
在 macOS 中,動態庫的加載方式可以分爲兩種:
- 動態加載:在程序運行時根據需要加載庫。這種方式適用於需要根據程序運行時的條件來加載不同的庫的情況,或者需要在程序運行時動態地加載插件的情況。
- 普通加載:在程序啓動時就加載庫。這種方式適用於那些在整個程序生命週期中都需要使用的核心庫或者常用庫。
-
在 macOS 中,動態加載庫的接口主要涉及到使用動態鏈接庫時的相關函數,這些函數通常包含在
<dlfcn.h>
頭文件中。以下是一些常用的動態加載庫的函數接口:-
dlopen()
:- 函數原型:
void *dlopen(const char *path, int mode);
- 功能:打開指定路徑的動態庫文件,並返回一個句柄(handle),該句柄可用於後續操作。
- 參數:
path
:動態庫文件的路徑。mode
:打開模式,通常爲RTLD_LAZY
(懶加載,在需要時才加載)或RTLD_NOW
(立即加載)等。
- 函數原型:
-
dlsym()
:- 函數原型:
void *dlsym(void *handle, const char *symbol);
- 功能:在已經打開的動態庫中查找指定名稱的符號(函數或變量),並返回其地址。
- 參數:
handle
:動態庫句柄,由dlopen()
返回。symbol
:要查找的符號的名稱。
- 函數原型:
-
dlclose()
:- 函數原型:
int dlclose(void *handle);
- 功能:關閉之前打開的動態庫句柄,並釋放相關資源。
- 參數:
handle
:要關閉的動態庫句柄。
- 函數原型:
-
dlerror()
:- 函數原型:
char *dlerror(void);
- 功能:返回上一個動態庫操作的錯誤信息。如果操作成功,則返回 NULL。
- 通常在
dlopen()
、dlsym()
、dlclose()
等函數調用失敗後調用,以獲取錯誤信息。
- 函數原型:
這些函數可以讓你在運行時動態地加載和使用動態庫中的函數和變量,從而實現更靈活的程序設計。需要注意的是,使用動態加載庫時,需要小心處理錯誤情況,避免因爲加載失敗或操作錯誤而導致程序崩潰或異常。
-