C ++ DLL导出:修饰/拼写的名称

创建了基本的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模板-没什么特别的。


肥皂起泡泡
浏览 343回答 3
3回答

潇湘沐

您可以通过关闭调试信息生成来获得所需的内容。项目+属性,链接器,调试,生成调试信息=否。自然,您只想针对Release版本执行此操作。已经以这种方式设置的选项。

素胚勾勒不出你

根据经验,如果__stdcall在函数签名中使用,请小心。使用__stdcall,该名称将在某种程度上保持混乱状态(您很快就会发现)。显然,存在两种级别的重整,一种extern "C"在C ++级别进行处理,但没有处理由引起的另一级名称整改__stdcall。多余的修改显然与重载有关-但我不确定。
打开App,查看更多内容
随时随地看视频慕课网APP