手把手教你写C语言的动态库的开发
前言
動(dòng)態(tài)庫的概念:
動(dòng)態(tài)庫提供了一種方法,使進(jìn)程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于一個(gè) DLL 文件中,
該 DLL 包含一個(gè)或多個(gè)已被編譯、鏈接并與使用它們的進(jìn)程分開存儲(chǔ)的函數(shù)。DLL 還有助于共享數(shù)據(jù)和資源。
多個(gè)應(yīng)用程序可同時(shí)訪問內(nèi)存中單個(gè) DLL 副本的內(nèi)容 — 百度百科
之前有寫過手把手教你C語言靜態(tài)庫的開發(fā)
靜態(tài)庫的缺點(diǎn):當(dāng)你調(diào)用靜態(tài)庫編譯后,生成exe后。靜態(tài)庫的東西都會(huì)直接嵌入到里面。
這樣你的exe程序會(huì)很大。而動(dòng)態(tài)庫則是動(dòng)態(tài)的調(diào)用的。它和你的exe程序是分開的,是動(dòng)態(tài)的調(diào)用。
動(dòng)態(tài)庫十分的方便,比如你寫了一個(gè)程序,如果想要更新它,只需把相對(duì)應(yīng)的動(dòng)態(tài)庫更新一下就行了。
廢話不多說,接下來寫一個(gè)最簡單的動(dòng)態(tài)庫。
寫一個(gè)簡單的動(dòng)態(tài)庫
先創(chuàng)建一個(gè)動(dòng)態(tài)庫項(xiàng)目:
在項(xiàng)目里創(chuàng)建一個(gè)demo.cpp一個(gè)demo.h。
兩個(gè)文件的內(nèi)容分別如下圖所示:
編譯一下,可以看到我們的動(dòng)態(tài)庫文件已經(jīng)生成。
這時(shí)候用一個(gè)叫depends的程序打開我們的dll文件。
depends軟件下載的官網(wǎng)鏈接:http://www.dependencywalker.com/
再用depends軟件隨便找一個(gè)dll文件打開
可以看到如下圖所示:
通過上面兩個(gè)圖片的對(duì)比你會(huì)發(fā)現(xiàn)我們寫的動(dòng)態(tài)庫文件打開后,沒有顯示我們寫的函數(shù)。即沒有導(dǎo)出接口。 通俗的來說就是,我們寫了一個(gè)庫,但是沒有接口,別人顯然是用不了。 所以我們得弄一個(gè)接口。
接下來我們只需在頭文件里,把我們的函數(shù)導(dǎo)出來就可以了。
再編譯一下,在打開看一下,會(huì)發(fā)現(xiàn)已經(jīng)有導(dǎo)出接口了。使用動(dòng)態(tài)庫
接下來就是使用要我們的靜態(tài)庫了。
我又創(chuàng)建了一個(gè)新的文件夾,并在該文件夾下創(chuàng)建了一個(gè)新的項(xiàng)目。
將我們剛才寫的動(dòng)態(tài)庫的頭文件和.lib文件.dll復(fù)制到該目錄下。
如下圖所示:
這里把這兩個(gè)文件復(fù)制到該目錄下的目的是: 該項(xiàng)目的工作空間默認(rèn)是這里,直接弄到這里就不用來配置demo.h和demodll.lib和demodll.dll的路徑了。方便使用。
運(yùn)行一下,看下效果。
為了防止將動(dòng)態(tài)庫和靜態(tài)庫弄混,看一下 下面這張圖。
上面那種使用動(dòng)態(tài)庫的方式是隱式調(diào)用,接下來動(dòng)態(tài)的調(diào)用動(dòng)態(tài)庫。
運(yùn)行之后你會(huì)發(fā)現(xiàn)并沒有成功,這是因?yàn)槲覀兊膶?dǎo)出函數(shù)并沒有加載成功 你會(huì)發(fā)現(xiàn)我們的導(dǎo)出函數(shù)的名稱是有點(diǎn)亂碼的,并不是sum,sub。 當(dāng)我們把加載的導(dǎo)出函數(shù)名稱改成這些亂碼的名稱后,程序就正常與運(yùn)行了。如下圖所示:
方式一:
方式二:
這樣也是可以的沒有亂碼的。
方法三:
用微軟提供的模塊定義文件直接定義。 無需像第一種將.cpp改為.c 也無需像第二種將函數(shù)的導(dǎo)出用extern "c"來導(dǎo)出。 直接在模塊定義文件直接定義就可以了。
沒有亂碼之后直接用sum,sub就可以了。
總結(jié)
以上是生活随笔為你收集整理的手把手教你写C语言的动态库的开发的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手把手教你C语言静态库的开发
- 下一篇: 将一台电脑的磁盘空间映射到另一台电脑