動態庫的靜態和動態加載方法

Linux 環境:

1. 動態加載:頭文件 #include <dlfcn.h>

    流程:(1)//獲取庫句柄

                       HANDLE hModule = dlopen(szPath, RTLD_LAZY);   

               (2)//獲取函數地址

                       typedef void(*Fun)(param1, param2,...); 

                       Fun pFun = (Fun)dlsym(hModule, _MMT("需要引用的庫函數名")); 

               (3)//函數調用

                      pFun(param1, param2,...);

               (4)//釋放庫句柄

                       dlclose(hModule);

                       hModule = NULL;

2.靜態加載:

  流程: (1)編譯條件裏,依賴動態庫  LIBS +=

              (2)調用庫函數之前,加載該動態庫。 dlopen 或者 Java 的 Load。

              (3)可以直接調用庫函數了,像調用靜態庫的方式,不再需要 dlsym 獲取庫函數的地址。

              (4)釋放步驟 (2) 裏的句柄。

 

顯式加載動態庫,除了調用 API: dlopen, Load,也可以直接把動態庫存放在系統目錄下,如 ./system/lib。

 

Windows 環境:

1.  動態加載:

    流程:同 Linux 流程一樣,只是 API 不同。

               (1)HANDLE hModule = ::LoadLibrary(szPath);

               (2)Fun pFun = (Fun)GetProcAddress((HINSTANCE)pInfo->hModule, _MMT("需要引用的庫函數名"));

               (3)pFun(param1, param2,...);

               (4)FreeLibrary(hModule);

                        hModule = NULL;

2. 靜態加載:(1)引用對應的靜態庫 .a

                      (2)HANDLE hModule = LoadLobrary(szPath);

                      (3)   可以直接調用庫函數了,不再需要 GetProcAddress 獲取庫函數的地址。

                      (4)FreeLibrary(hModule);

                               hModule = NULL;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章