日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手把手教你写C语言的动态库的开发

發布時間:2025/3/20 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手把手教你写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的路徑了。方便使用。


運行一下,看下效果。


為了防止將動態庫和靜態庫弄混,看一下 下面這張圖。

直接只運行一個exe而沒有dll你會發現會報這個錯誤,因為沒有動態庫.dll文件。但是當我們用靜態庫直接運行exe時并不會報錯。 于是你就會發現,靜態庫是嵌入到exe里面的,而動態庫不是嵌入到exe里面的是和exe分開存在的。

上面那種使用動態庫的方式是隱式調用,接下來動態的調用動態庫。

運行之后你會發現并沒有成功,這是因為我們的導出函數并沒有加載成功

你會發現我們的導出函數的名稱是有點亂碼的,并不是sum,sub。 當我們把加載的導出函數名稱改成這些亂碼的名稱后,程序就正常與運行了。

如下圖所示:

那么為啥導出來的函數是亂碼呢? 這是因為我們用的是c++的語法,在導出的時候就會將導出來的函數名是亂碼 用C語言的語法導出函數就不會出現亂碼如何解決呢? 有兩種方法:方法一、在寫動態庫時用.c即C語言的語法導出。結果就不會是亂碼了。方式二,在寫動態庫時用.cpp即C++的文件但是用c語言的語法導出。方法三,用微軟提供的模塊定義文件直接定義 具體操作如下:

方式一:

這時候你就可以直接用sum,sub了而無需用亂碼了。

方式二:

這樣也是可以的沒有亂碼的。


方法三:

用微軟提供的模塊定義文件直接定義。 無需像第一種將.cpp改為.c 也無需像第二種將函數的導出用extern "c"來導出。 直接在模塊定義文件直接定義就可以了。



沒有亂碼之后直接用sum,sub就可以了。

總結

以上是生活随笔為你收集整理的手把手教你写C语言的动态库的开发的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。