標籤:靜態庫 動態庫 建立 使用 windows
windows庫的建立和使用:靜態庫+動態庫
一、靜態庫的建立和使用1. 靜態庫建立
(1)首先建立工程test,測試代碼如下:
1) test.h
2) test.cpp
#include "test.h" #include <stdio.h> void test_print() { printf("test_print in static lib."); } |
3)右擊工程test:屬性——>配置屬性——>常規——>配置類型:選擇靜態庫lib
4)編譯工程(build),然後會在解決方案裡的Debug下會產生test.lib。
2. 使用靜態庫 = lib檔案 + 標頭檔
1)建一個新的工程uselib
2)點擊資源檔——>添加已有項——>加入剛才產生的庫test.lib
3)右擊屬性——>VC++目錄——>包含目錄:將test.h所在目錄添加進來
工程代碼如下:
1)main.cpp
#include "test.h" #include<stdio.h> int main() { test_print(); getchar(); } |
調試就能看到調用成功。
二、 動態庫的建立與使用1. 靜態載入動態庫
1)建立工程static_load
static_dll.h
//匯出類 class __declspec(dllexport) static_test { public: void print(); }; //匯出函數 __declspec(dllexport) void static_function(); //匯出對象 extern __declspec(dllexport) static_test static_ObjTest; |
static_dll.cpp
#include "static_dll.h" #include <stdio.h> void static_test::print() { printf("static_test::print() in static load dll.\n"); } void static_function() { printf("static_function in static load dll.\n"); } static_test static_ObjTest; |
__declspec(dllexport)表示作為動態庫的匯出項,否則會找不到變數或者函數或者類等。配置類型選擇:動態庫(dll).
2)靜態載入的方式使用動態庫
首先建立一個dll.h
//導入類 class __declspec(dllimport) static_test { public: void print(); }; //導入函數 __declspec(dllimport) void static_function(); //導入對象 extern __declspec(dllimport) static_test static_ObjTest; |
__declspec(dllimport)表明該項是從動態庫匯入的外部匯入項。
建立一個測試工程uselib
main.cpp
#include "dll.h" #include<stdio.h> int main() { static_test st; st.print(); static_function(); static_ObjTest.print(); getchar(); } |
同時需要將static_load.lib和static_load.dll放到同一目錄下,且.lib檔案匯入到資源檔下。
2 動態載入動態庫
1. 為區別對待這裡建立工程dynamic_load
dynamic_dll.h
//匯出類 class __declspec(dllexport) dynamic_test { public: void print(); }; //匯出函數 __declspec(dllexport) void dynamic_function(); //匯出對象 extern __declspec(dllexport) dynamic_test dynamic_ObjTest; |
dynamic_dll.cpp
#include "dynamic_dll.h" #include <stdio.h> void dynamic_test::print() { printf("dynamic_test::print() in dynamic load dll."); } void static_function() { printf("dynamic_function in dynamic load dll."); } dynamic_test dynamic_ObjTest; |
配置類型選擇:動態庫(dll).然後編譯(build)。
建立一個工程uselib
#include<stdio.h> #include<Windows.h> int main() { HINSTANCE hDLL = LoadLibraryA("dynamic_load.dll"); if(hDLL==NULL) { FreeLibrary(hDLL); return 0; } typedef void(_stdcall*func)(); func f; f = (func)GetProcAddress(hDLL,"dynamic_function"); if(f) (*f)(); getchar(); } |
注意我們必須在LoadLibraryA中傳入dll的準確路徑,且若使用char*的路徑,則使用LoadLibraryA,否則若是unicode則使用LoadLibraryW。至於動態匯入類有點麻煩,故在此先不討論。
windows庫的建立和使用:靜態庫+動態庫