亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

C ++ DLL導出:修飾/拼寫的名稱

C ++ DLL導出:修飾/拼寫的名稱

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

3 回答

?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

您可以通過關閉調試信息生成來獲得所需的內容。項目+屬性,鏈接器,調試,生成調試信息=否。


自然,您只想針對Release版本執行此操作。已經以這種方式設置的選項。


查看完整回答
反對 回復 2019-12-14
?
素胚勾勒不出你

TA貢獻1827條經驗 獲得超9個贊

根據經驗,如果__stdcall在函數簽名中使用,請小心。使用__stdcall,該名稱將在某種程度上保持混亂狀態(您很快就會發現)。顯然,存在兩種級別的重整,一種extern "C"在C ++級別進行處理,但沒有處理由引起的另一級名稱整改__stdcall。多余的修改顯然與重載有關-但我不確定。


查看完整回答
反對 回復 2019-12-14
  • 3 回答
  • 0 關注
  • 396 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號