VS C++生成dll和静态调用dll的方法
一、動態鏈接庫(dll)概述
在實際編程中,我們可以把完成某項功能的函數放在一個動態鏈接庫里,然后提供給其他程序調用。
1.1 靜態庫和動態庫
靜態庫:
函數和數據被編譯進一個二進制文件(擴展名通常為.lib),在使用靜態庫的情況下,在編譯鏈接可執行文件時,鏈接器從靜態庫中復制這些函數和數據,并把它們和應用程序的其他模塊組合起來創建最終的可執行文件(.exe)。當發布產品時,只需要發布這個可執行文件,并不需要發布被使用的靜態庫。
動態庫:
在使用動態庫時,往往提供兩個文件:一個引入庫(.lib,非必須)和一個.dll文件。這里的引入庫和靜態庫文件雖然擴展名都是.lib,但是有著本質上的區別,對于一個動態鏈接庫來說,其引入庫文件包含該動態庫導出的函數和變量的符號名,而.dll文件包含該動態庫實際的函數和數據。
1.2 使用動態鏈接庫的好處
1. 可以使用多種編程語言編寫:
比如我們可以用VC++編寫dll,然后在VB編寫的程序中調用它。
2. 增強產品功能:
可以通過開發新的dll取代產品原有的dll,達到增強產品性能的目的。比如我們看到很多產品踢動了界面插件功能,允許用戶動態地更換程序的界面,這就可以通過更換界面dll來實現。
3. 提供二次開發的平臺:
用戶可以單獨利用dll調用其中實現的功能,來完成其他應用,實現二次開發。
4. 節省內存:
如果多個應用程序使用同一個dll,該dll的頁面只需要存入內存一次,所有的應用程序都可以共享它的頁面,從而節省內存。
二、dll的創建
第一步: 創建cpp 和 h 文件。
1、在VS中創建xxx.h, xxx.cpp
2、xxx.h 內容格式如下:
#ifdef BUILD_XXX_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
extern “C”{
EXPORT void example(void); //被調用的函數聲明
… …
}
xxx.cpp內容格如下:
#define BUILD_XXX_DLL
#include “xxx.h”
void example(void) //被調用的函數
{
}
… …
注意:
1.__declspec是關鍵字,用于表示該函數、變量是導出、導入的,括號里dllexport意為其將要導出,dllimport意為其將要導入。
2.extern "C"用于指定編譯器編譯后的函數別名,這樣使用時才能正確查找到。即對于變量extern int a;這樣的直接寫為extern “C” int a;即可,函數同理。
具體過程如下:
1、建立項目:
單擊下一步,選擇DLL方式,創建項目
建立MyCode.cpp 內容如下:
建立 MyCode.h 內容如下:
#ifndef _MYCODE_H_ #define _MYCODE_H_#ifdef DLLDEMO_EXPORTS #define EXPORTS_DEMO _declspec( dllexport ) #else #define EXPORTS_DEMO _declspec(dllimport) #endifextern "C" EXPORTS_DEMO int Add(int a, int b);#endif第二步:生成解決方案。
此時自動生成了MyCode,此時在項目的debug 文件下會自動生成MyDLLDemo.dll 和 MyDLLDemo.lib 文件。
三、dll的使用
移除 stdafx.cpp, stdafx.h,targetver.h
myProject 項目中只剩下 myProject.cpp 文件
右鍵,設定myProject 項目為啟動項。
在myProject.cpp 右鍵,彈出的屬性對話框中,選擇不使用預編譯頭。
修改myProject.cpp 文檔內容,如下:
最后 運行,OK!調用成功。
總結
以上是生活随笔為你收集整理的VS C++生成dll和静态调用dll的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#泛型的简单理解
- 下一篇: C# 调用C++写的dll的实现方法