這個東西搞了好幾天,現在終於沒有問題了,其實現在想來還是微軟做的東西好用啊,在這里點個贊!!!
LL是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。動態鏈接提供了一種方法,使進程可以調用不屬於其可執行代碼的函數。函數的可執行代碼位於一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接並與使用它們的進程分開存儲的函數。本文介紹了使用VS2013和C++進行動態庫的編寫,一方面C++運行速度之快大家有目共睹,另一方面,好多技術都是基於C++,如OPENCV ,若是用C++混合編寫比其它語言較為容易,使用C++建立動態庫公其他語言使用是相當划算的。
方法/步驟
-
建立一個C++的Win32DLL,這里要注意選擇"Export symbols"導出符號。點擊完成。 如下圖所示:
-
由於項目的名稱是"TestCPPDLL",因此,會自動生成TestCPPDLL.h和TestCPPDLL.cpp兩個文件,.h文件是要導出內容的聲明文件,為了能清楚的說明問題,我們將TestCPPDLL.h和TestCPPDLL.cpp兩個文件中的所有內容都刪除,然后在TestCPPDLL.h中添加如下內容:
-
第一行代碼中定義了一個名為"TESTCPPDLL_API"的宏,該宏對應的內容是"__declspec(dllexport)"意思是將后面修飾的內容定義為DLL中要導出的內容。當然你也可以不使用這個宏,可以直接將"__declspec(dllexport)"寫在要導出的函數前面。
第二行中的"EXTERN_C",是在"winnt.h"中定義的宏,在函數前面添加"EXTERN_C"等同於在函數前面添加extern "C",意思是該函數在編譯和連接時使用C語言的方式,以保證函數名字不變。
第二行的代碼是一個函數的聲明,說明該函數可以被模塊外部調用,其定義實現在TestCPPDLL.cpp中,TestCPPDLL.cpp的代碼如下所示:
-
第三步:
在編譯C++DLL之前,需要做以下配置,在項目屬性對話框中選擇"C/C++"|"Advanced",將Compile AS 選項的值改為"C++"。然后確定,並編譯。
-
生成的DLL文件如下圖所示:
-
最后就是應用了,具體的內容見下面
-
#include "..\\DllClient\\DllClient.h"
#pragma comment(lib, "..\\debug\\DLLClient.lib")
int _tmain(int argc, _TCHAR* argv[])
{
CDllClient test;
int a = test.add(1, 2);
printf("我特么成功了!!!!%d", a);