使用def檔案簡化dll匯出

2021-08-11 06:08:35 字數 1374 閱讀 5526

在c++中,我們可以通過 __declspec(dllexport) 將函式匯出為dll中供其它程式使用,例如:

_declspec(dllexport) intadd(inta, intb);

在這種方式下,如果呼叫該dll的是乙個c++程式(同乙個編譯器的版本)是沒有問題的。但是,如果呼叫該dll是乙個其它語言的程式(如c#、vb),則會出錯。究其原因,是因為在c++中存在函式的過載,允許函式重名,因此在編譯器生成dll的時候,為了區別重名的程式,會將其進行一定演算法進行名稱轉換。例如,對於前面的add函式,實際的函式名稱是如下形式。

因此,我們直接通過函式名add是無法找到該函式的,從而導致呼叫失敗。為了解決這一問題,我們往往在函式前面再加乙個extern"c"

,使用c方式的函式命名規則。

extern"c"_declspec(dllexport) intadd(inta, intb);

這樣函式的名稱就成add了。

這樣,我們就需要在每乙個函式簽名加上"extern"c"_declspec(dllexport)

"這一長串宣告。如果需要匯出的函式較多則顯得非常繁瑣,也非常難看。為了簡化這一過程,ms引入了def檔案方便我們操作。

使用def檔案比較簡單,只需要在專案中新增乙個def檔案,然後把我們要匯出的函式放在def檔案中即可。

def檔案的簡單示例如下:

library 

exports

add最後記得在鏈結器選項中選中使用的def檔案(預設情況下,新增def檔案時會自動加上該選項,無需手動更改)。

這樣,我們的函式無需加那一堆字首,仍然可以使用預設的intadd(inta, intb);

形式,但匯出後的方式

依然是c形式的函式定義。

最後指得一提的是,一般c/c++預設的呼叫方式是__cdecl,這種方式下需要呼叫方對函式清棧。如果對外提供api共其它非c++程式使用時,呼叫方會無法清棧而出錯(c#會直接報函式宣告不匹配的錯誤)。因此,對外提供api時還應該將介面宣告為__stdcall,讓api函式自己清棧。這也是windows api前面都加上了乙個winapi的巨集的原因。

def檔案還有許多其它的高階用法,要進一步了解的話,可以參看一下ms的官方文件:

使用Def檔案匯出Dll檔案

本文介紹如何使用def檔案製作dll。模組定義 def 檔案是包含乙個或多個描述 dll 各種屬性的 module 語句的文字檔案。如果不使用 declspec dllexport 關鍵字匯出 dll 的函式,則 dll 需要 def 檔案。def 檔案必須至少包含下列模組定義語句 步驟 1.新建乙...

使用Def檔案匯出Dll檔案

本文介紹如何使用def檔案製作dll。模組定義 def 檔案是包含乙個或多個描述 dll 各種屬性的 module 語句的文字檔案。如果不使用 declspec dllexport 關鍵字匯出 dll 的函式,則 dll 需要 def 檔案。def 檔案必須至少包含下列模組定義語句 步驟 1.新建乙...

dll匯出def和lib檔案

在windows下程式設計的同學,可能都知道可以使用depends這個工具檢視dll依賴項和匯出符號,卻很少知道在命令列下,有兩個更好用的命令,分別是dumpbin和lib,這是vs安裝目錄下的兩個程式。用法 dumpbin 選項 檔案 選項 all archivemembers clrheader...