創(chuàng)建了基本的C ++ DLL,并使用模塊定義文件(MyDLL.def)導(dǎo)出了名稱。編譯后,我使用以下命令檢查導(dǎo)出的函數(shù)名稱dumpbin.exe :SomeFunction但是我看到的是:SomeFunction = SomeFunction@@@23mangledstuff#@@@@為什么?導(dǎo)出的函數(shù)看起來沒有修飾(尤其是與不使用Module Def文件相比),但是其他內(nèi)容又如何呢?如果我使用dumpbin.exe任何商業(yè)應(yīng)用程序中的DLL進行清潔,那么您都可以:SomeFunction沒什么...我還嘗試了刪除模塊定義,并使用“ C”導(dǎo)出樣式導(dǎo)出名稱,即:extern "C" void __declspec(dllexport) SomeFunction();(僅使用“ extern“ C”不會創(chuàng)建導(dǎo)出函數(shù))但是,這仍會創(chuàng)建相同的輸出,即:SomeFunction = SomeFunction@@@23mangledstuff#@@@@我還嘗試了該#define dllexport __declspec(dllexport)選項,并毫無問題地創(chuàng)建了LIB。但是,我不想為使用C#應(yīng)用程序中的DLL的用戶提供LIB文件。它是普通的C ++ DLL(非托管代碼),僅使用簡單的標頭和代碼即可使用C ++進行編譯。沒有Module Def,我將無法處理導(dǎo)出的函數(shù)(我可以創(chuàng)建一個靜態(tài)庫并使用LIB沒問題。我試圖避免這種情況)。如果使用extern "C" __declspec(dllexport) OR或 Module Definition,我得到的似乎是未修飾的函數(shù)名稱...唯一的問題是它后面跟有一個“ =”,并且看起來像該函數(shù)的修飾版本。我想擺脫“ =”之后的內(nèi)容-或至少了解其中的原因。就目前而言,我非常確定我可以使用P / Invoke從C#調(diào)用該函數(shù)...我只是想避免在“ =”末尾出現(xiàn)垃圾。我愿意就如何更改項目/編譯器設(shè)置提出建議,但我只是使用了標準的Visual Studio DLL模板-沒什么特別的。
3 回答

瀟湘沐
TA貢獻1816條經(jīng)驗 獲得超6個贊
您可以通過關(guān)閉調(diào)試信息生成來獲得所需的內(nèi)容。項目+屬性,鏈接器,調(diào)試,生成調(diào)試信息=否。
自然,您只想針對Release版本執(zhí)行此操作。已經(jīng)以這種方式設(shè)置的選項。

素胚勾勒不出你
TA貢獻1827條經(jīng)驗 獲得超9個贊
根據(jù)經(jīng)驗,如果__stdcall
在函數(shù)簽名中使用,請小心。使用__stdcall
,該名稱將在某種程度上保持混亂狀態(tài)(您很快就會發(fā)現(xiàn))。顯然,存在兩種級別的重整,一種extern "C"
在C ++級別進行處理,但沒有處理由引起的另一級名稱整改__stdcall
。多余的修改顯然與重載有關(guān)-但我不確定。
- 3 回答
- 0 關(guān)注
- 397 瀏覽
添加回答
舉報
0/150
提交
取消