为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 353 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信