生成 DLL 時會生成一個與之匹配的 .lib 文件(導入庫文件),用於存放調用 DLL 所需的信息。若是你想調用這個 DLL 則必須將 lib 連接進程序。(導入庫 lib 文件和靜態庫的 lib 雖然都會被連接進程序,但二者的內容徹底不一樣)函數
在 VS 上建立 DLL 須要使用 Microsoft 專用 C\C++ 擴展 —— dllexport 和 dllimport 存儲類特性。可使用它們從 DLL 中導出或向其中導入函數、數據和對象。語法以下:性能
__declspec( dllimport ) declarator __declspec( dllexport ) declarator
提示: 若是不使用 __declspec(dllexport) 關鍵字導出 DLL 的函數,則 DLL 須要 .def 文件。模塊定義 (.def) 文件是包含一個或多個描述 DLL 各類特性的 Module 語句的文本文件。操作系統
建立一個動態連接庫項目。(Visual Studio:新建 C++ 項目-->Win32控制檯應用,在 應用程序設置 頁面的 應用程序類型 下選擇 DLL)線程
// dll.h #pragma once #ifdef FUNCTION_EXPORTS #define FUNCTIONDLL_API __declspec(dllexport) // 導出,導出用於生成 DLL #else #define FUNCTIONDLL_API __declspec(dllimport) // 導入,用於導入 dllexport 導出的內容 #endif FUNCTIONDLL_API int a(int num1, int num2); FUNCTIONDLL_API int b(int num1, int num2);
// dll.c #define FUNCTION_EXPORTS #include "dll.h" int a(int num1, int num2) { return num1 + num2; } int b(int num1, int num2) { return num1 + num2; }
生成 DLL ,會獲得 DLL 和 lib 文件。指針
調用/連接 DLL 有兩種方法,一,隱式連接;二,顯示連接。code
爲隱式連接到 DLL,應用程序必須:對象
隱式連接後,程序操做 DLL 中函數的方法同本地函數並沒有區別。進程
爲顯式連接到 DLL,應用程序必須:作用域
我建立的調用程序使用隱式連接:編譯器
#include "dll.h" int main(void) { printf("%d\n", a(1, 2)); printf("%d\n", b(3, 4)); return 0; }
首先添加引用(兩個項目在同一解決方案下才可引用),項目 --> 添加引用,將 DLL 項目添加進去(添加引用的目的是爲了添加 lib 文件,效果與在 (若是不在同一解決方案,應使用下述方法:) 配置屬性 --> 連接器 --> 輸入 --> 附加依賴項 添加 lib 相同)。
而後添加附加包含目錄,配置屬性 --> C\C++ --> 常規 --> 附加包含目錄,將 dll.h 文件的地址添加進去便可。
若是你的 DLL 和 調用程序再也不同一目錄,能夠將 DLL 所在目錄添加至系統環境變量或將 DLL 同調用程序放至同一目錄。
編譯,執行結果以下:
3 7
大部分應用程序使用隱式連接,由於這是最易於使用的連接方法。可是有時也須要顯式連接。下面是一些使用顯式連接的常見緣由:
下面是須要注意的顯式連接的兩個缺點: