使用 def 文件和 extern "C" 进行名称修改
我正在创建一个基本的 COM 组件,以便我可以练习创建它们。
我正在使用 PRIVATE 关键字从 .def 文件导出 DllRegisterServer、DllUnregisterServer、DllGetClassObject 和 DllCanUnloadNow(我认为 Microsoft 需要它)。
不管怎样,我用 extern "C" 指定了所有 4 个函数,但我仍然受到损坏。 这是我的 .def:
EXPORTS
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
这是来自 dumpbin /EXPORTS 的重整
_DllCanUnloadNow@0
_DllGetClassObject@12
_DllRegisterServer@0
_DllUnregisterServer@0
我知道 extern "C" 有帮助,因为没有它我会得到非常糟糕的重整,但我认为带有 extern "C" 的 .def 应该摆脱名称损坏?
我的编译器是VC++ Express 2008。 链接器命令行:
/OUT:"G:\Programming\COM\BasicMathCOM\BasicMath\Release\BasicMath.dll" /INCRMENTAL:NO /NOLOGO /DLL /MANIFEST /MANIFESTFILE:"Release\BasicMath.dll.intermediate.manifest" / MANIFESTUAC:"level='asInvoker' uiAccess='false'" /DEBUG /PDB:"g:\Programming\COM\BasicMathCOM\BasicMath\Release\BasicMath.pdb" /SUBSYSTEM:WINDOWS /OPT:REF /OPT:ICF / LTCG /DYNAMICBASE /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
+ /DEF:BasicMath.def,我在附加选项下添加了它。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您实际上使用.def 文件吗?
我们可以看看你的编译命令行吗?
Are you actually using the .def file?
Can we see your command line to compile?
抱歉,我修好了。当我将命令行复制到我的问题中时,即使我已经设置了发布配置,我也看到了 /DEBUG。我看到Generate Debugging Info被无意中打开了,所以我禁用它并重新编译。名字变形已经消失了。
感谢您的帮助。
Sorry, I fixed it. When I was copying the command line into my question I saw a /DEBUG even though I had set the Release Configuration. I saw that the Generate Debugging Info had been inadvertently turned on, so I disabled it and re-compiled. The name mangling is gone.
Thanks for your help.