? 這幾天看了許多關于生成Dll的博文,很有感觸,遂整理在此,以供自己后續參考。
VS2013創建DLL
我們使用vs2013來生成Dll,其實使用其他的版本也是同理如此。步驟如下:
? 單擊“新建項目”,選擇“Win32 項目”,選擇“下一步”,然后到了如下界面:
點擊“DLL”,并同時點擊“導出符號”。然后點擊“完成”。
值得說明的是:
為什么要導出符號呢?
這是因為“導出符號”,將為我們創建生成DLL的模板。
仔細觀察,vs自動為我們創建了導出變量nMakeDLL,導出函數fnMakeDLL,導出類CMakeDLL。如果上面沒有點擊“導出符號”,將不會生成這些。所以為了方便DLL的創建,我們最好還是使用“導出符號”。
接下來,你可以改寫上面的類和函數,然后點擊項目,選擇“生成”即可產生DLL和LIB。此處細節可參考《vs2010創建并使用DLL》。
細節的闡述
1.dllexport與dllimport的介紹
先看下面這段代碼:
#ifdef MAKEDLL_EXPORTS
#define MAKEDLL_API __declspec(dllexport)
#else
#define MAKEDLL_API __declspec(dllimport)
#endif
我們逐條解釋。
如果定義了MAKEDLL_EXPORTS,然后我們再定義MAKEDLL_API為__declspec(dllexport),否則我們定義__declspec(dllimport)。前者主要為生成DLL的項目所使用,后者為使用DLL的項目所使用。dllexport?和?dllimport?存儲類特性是 C 和 C++ 語言的 Microsoft 專用擴展。可以使用它們從 DLL 中導出或向其中導入函數、數據和對象。使用這兩個特性,將會優化導入導出,至于具體怎么優化,可參考msdn上的解讀《dllexport,dllimport》.
事實上MAKEDLL_EXPORTS在創建DLL時是默認定義的,每當創建一個新的DLL項目時,vs會自動生成MAKEDLL_EXPORTS,我們可以在項目的屬性中看到:
2.lib與dll的使用
而在引用一個新的dll時,比如我們采用靜態引用的方法時,我們一般需要dll的.h,.lib和.dll三個文件,這時我們在新建項目的“屬性”中選擇“C/C++”-》“常規”-》“附加包含目錄”,添加.h的路徑,在“鏈接器”—》“常規”-》“附加庫目錄”中添加.lib的路徑,同時我們還需要添加.lib的附加依賴項,這時可在“鏈接器”—》“輸入”—》“附加依賴項”,填寫**.lib?,最后還需要加載dll的路徑,此時有兩種方法最為常見。第一種,我們先直接運行程序,這時會出現一個錯誤,說“缺少什么dll”,我們只需將此前生成的dll,放在debug或release目錄下,即可編譯通過。第二種方法,直接將dll放在與.cpp同一目錄下,即可編譯通過。或者你也可以放在某一個新建的bin文件下,然后在項目的“path”中填寫.bin的路徑,如下所示:
填寫路徑時注意,前面的"path=%path%;" 必須有,后面可填寫絕對路徑或相對路徑。
另外我們再仔細講講lib的使用。
使用lib庫有兩個方法,一個是直接把lib引到工程目錄下,在需要用到的地方include一下就可以。代碼是:
#pragma comment(lib, "testCpp.lib")
另外一個方法是直接設置庫路徑,就不用把lib引到工程目錄下了。直接點開工程屬性,在配置屬性-》連接器-》常規-》附加庫目錄中添加庫
之后確認。
在配置屬性-》連接器-》輸入-》附加依賴項。如圖填寫
之后確定,運行工程就可以了。
總結一下,我們使用別人的庫時,如果想偷懶的話,將.h,.lib,.dll都放在工程目錄下,最后會發現我們需要在使用dll的main函數中加載上頭文件,再像第一種方法一樣,鏈接lib,就可以直接使用了。可參考文件:testDLL.zip
但是我更推崇另一種方法,就是我們單獨建立include,bin,lib文件夾,然后將他們分別按照上面的方法鏈接上。這樣如果要添加的庫比較多時,會更加整齊,可讀。
總的來說;.h,.lib,.dll的添加方法其實各有很多種,其中.h有兩種:
1. 直接放在工程目錄下
2. 建立include文件夾,放在里面,然后在項目屬性的“C/C++”-》“常規”-》“附加包含目錄”,添加.h路徑即可。
.lib的方法有兩種
1.直接放在工程目錄下
2.建立lib文件夾,放在里面,然后在項目屬性的“鏈接器”-》“常規”-》“附加庫目錄”,添加.lib路徑即可。
dll的方法有兩種
1.直接放在工程目錄下
2.建立bin文件夾,放在里面,然后在項目“環境”中添加bin的路徑
.lib的附加依賴項有2種:
1.在“鏈接器”——》“輸入”-》“附加依賴項”,填寫lib名稱
2.在main文件前面,添加語句:
#pragma comment(lib, "testCpp.lib")
以上皆可以自由組合。
參考文獻:
1.演練:創建和使用動態鏈接庫 (C++)
2.?C++的dllexport和dllimport?
3.VS2013創建dll動態鏈接庫文件心得
4.VS2010創建并使用DLL
????????