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