vs2013創建及使用DLL

? 這幾天看了許多關于生成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引到工程目錄下了。直接點開工程屬性,在配置屬性-》連接器-》常規-》附加庫目錄中添加庫

vs2013生成lib4


vs2013生成lib5


之后確認。

在配置屬性-》連接器-》輸入-》附加依賴項。如圖填寫

vs2013生成lib6


之后確定,運行工程就可以了。

總結一下,我們使用別人的庫時,如果想偷懶的話,將.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













????????



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259000.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259000.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259000.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python的作用域分別有幾種_python中作用域與函數嵌套

知識回顧: 拆解傳參。 1.字典傳參。使用** 2.列表傳參。使用* 實際上我們在定義函數的時候,如果省略了星號,那么在調用函數的時候必須要省略星號,除非我們拆解后的參數個數剛好相等。 視頻內容 本節知識視頻教程 文字講解開始&…

這個博客的由來

筆者從事電信行業大型商業智能系統工作多年,日前從事B2C電商網站類數據分析工作,特開設此微博,在發表好文同時,研究網站分析技術。轉載于:https://www.cnblogs.com/sambazhu/p/3508633.html

《Axure RP8 網站和APP原型制作 從入門到精通》一2.7 交付

本節書摘來自異步社區《Axure RP8 網站和APP原型制作 從入門到精通》一書中的第2章,第2.7節,作者 金烏,更多章節內容可以訪問云棲社區“異步社區”公眾號查看 2.7 交付 模型一旦經過批準,我們就可以進入切圖和優化圖像環節了。我…

iOS UISegmentedControl 的使用

當用戶輸入不僅僅是布爾值時,可使用分段控件(UISegmentedControl)。分段控件提供一欄按鈕(有時稱為按鈕欄),但只能激活其中一個按鈕。分段控件會導致用戶在屏幕上看到的內容發生變化。它們常用于在不同類別…

js粘貼板為什么獲取不到圖片信息_【第1829期】復制黏貼上傳圖片和跨瀏覽器自動化測試...

前言這個操作體驗倒是不錯。今日早讀文章由丁香園蔣璇投稿分享。蔣璇, 前端開發攻城獅, 現任職于丁香園. 英語愛好者, 測試驅動開發(TDD)&行為驅動開發(BDD)推崇者. 先專注于 https://github.com/Jiang-Xuan/tuchuang.space 項目的測試驅動開發探索正文從這開始~~在網頁中上…

在C++中調用DLL中的函數

轉載自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html   應用程序使用DLL可以采用兩種方式:一種是隱式鏈接,另一種是顯式鏈接。在使用DLL之前首先要知道DLL中函數的結構信息。Visual C6.0(或者更先進的版…

CentOS LVS安裝配置

目錄(?)[] 一般2.6.10以上內核版本都已經自帶了ipvsadm,故不需要安裝。 Ipvs 1.25編譯 ipvsadm-1.25編譯不過 去掉netlink庫的依賴:去掉libipvs/Makefile的CFLAGS -DLIBIPVS_USE_NL,去掉Makefile的LIBS -lnl。需要popt庫解析命令行,在這里…

《淘寶網開店 拍攝 修圖 設計 裝修 實戰150招》一一2.7 橫式構圖和豎式構圖...

本節書摘來自異步社區出版社《淘寶網開店 拍攝 修圖 設計 裝修 實戰150招》一書中的第2章,第2.7節,作者: 葛存山,更多章節內容可以訪問云棲社區“異步社區”公眾號查看。 2.7 橫式構圖和豎式構圖 橫幅畫面,即畫面底邊…

Node.js初接觸(一)

本來還在糾結著到底要學哪一種后臺語言呢,突然發現node.js很火,既然能被這么多人推崇,自然是有他的優勢的。去百度百科看了一眼,或許是我理解能力太差,并沒有了解到很多關于node.js的東西,大概就是知道了No…

python request file upload_Python基于requests實現模擬上傳文件

方法1: 1.安裝requests_toolbelt依賴庫 #代碼實現 def upload(self): login_token self.token.loadTokenList() for token in login_token: tempPassword_url self.config[crm_test_api]/document/upload tempPassword_data self.data_to_str.strToDict(title:1.…

MATLAB中的randi函數

randi Pseudorandom integers from a uniform discrete distribution.來自一個均勻離散分布的偽隨機整數 R randi(IMAX,N) returns an N-by-N matrix containing pseudorandom integer values drawn from the discrete uniform distribution on 1:IMAX.返回一個NN的包含偽隨機…

C++ dll的隱式與顯式調用

轉載自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html   應用程序使用DLL可以采用兩種方式:一種是隱式鏈接,另一種是顯式鏈接。在使用DLL之前首先要知道DLL中函數的結構信息。Visual C6.0&…

《OpenGL ES 2.0游戲開發(上卷):基礎技術和典型案例》——6.5節光照的每頂點計算與每片元計算...

本節書摘來自異步社區《OpenGL ES 2.0游戲開發(上卷):基礎技術和典型案例》一書中的第6章,第6.5節光照的每頂點計算與每片元計算,作者 吳亞峰,更多章節內容可以訪問云棲社區“異步社區”公眾號查看 6.5 光照…

毛筆筆鋒算法IOS版

http://www.merowing.info/2012/04/drawing-smooth-lines-with-cocos2d-ios-inspired-by-paper/#.VUln2_mqpBe轉載于:https://www.cnblogs.com/wangjinming/p/4481145.html

USE PDFCREATE TO CREATE A PDF FILE

來源:http://www.pdfforge.org/files/old_forum/1002.html a working sample with C & COM 2007-08-15 22:56:18 by eckart hi, here is a working sample of how to use PDFCreator in Visual C (after searching on internet for something similar I guess t…

python將一行作為字段_關于python:Django admin在同一行顯示多個字段

我已經創建了一個模型,它將自動顯示模型中的所有字段,并將其顯示在管理頁面上。 現在,我有一個問題,我希望在同一行中有兩個字段,為此,我必須在modeladmin中指定字段集: 1 2 3 4 5fieldsets ( …

c++顯式加載dll并使用DLL的類

轉載自: http://blog.163.com/tianjunqiang666126/blog/static/8725911920121064573594/ 首先需要強調,當使用某個類時一般目的有二:實例化成對象或者繼承它產生新類。對于前者,我們可以構造一個抽象類&a…

如何在Debian上安裝配置ownCloud

如何在Debian上安裝配置ownCloud 據其官方網站,ownCloud可以讓你通過一個Web界面或者WebDAV訪問你的文件。它還提供了一個平臺,可以輕松地查看、編輯和同步您所有設備的通訊錄、日歷和書簽。盡管ownCloud與廣泛使用Dropbox非常相似,但主要區別…

jQuery相當于對 javascript二次開發,所以基于 jQuery實現的各種插件直接調用即可...

jQuery相當于對 javascript二次開發,所以基于 jQuery實現的各種插件直接調用即可轉載于:https://www.cnblogs.com/npk19195global/p/4482363.html

[轉]js判斷url是否有效

本文轉自:http://www.cnblogs.com/fumj/p/3490121.html 方法一:(僅適用于ie) function CheckStatus(url){XMLHTTP new ActiveXObject("Microsoft.XMLHTTP")XMLHTTP.open("HEAD",url,false)XMLHTTP.send()return XMLHTTP.status200}function Ne…