使用 def 文件和 extern "C" 进行名称修改

发布于 2024-08-15 01:19:18 字数 1222 浏览 6 评论 0 原文

我正在创建一个基本的 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,我在附加选项下添加了它。

I'm creating a basic COM component so I can practice creating them.

I'm exporting DllRegisterServer, DllUnregisterServer,DllGetClassObject and DllCanUnloadNow from a .def file with the PRIVATE keyword(I think Microsoft requires it).

Anway, I specified all 4 functions with extern "C" and yet I'm still getting mangling.
Here is my .def:

EXPORTS
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE

Here is the mangling from dumpbin /EXPORTS

_DllCanUnloadNow@0
_DllGetClassObject@12
_DllRegisterServer@0
_DllUnregisterServer@0

I know the extern "C" helps, because I get really bad mangling without it, but I thought the .def with extern "C" was supposed to get rid of name mangling?

My compiler is VC++ Express 2008.
Linker Command Line:

/OUT:"G:\Programming\COM\BasicMathCOM\BasicMath\Release\BasicMath.dll" /INCREMENTAL: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, which I had added under additional options.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

十六岁半 2024-08-22 01:19:18

您实际上使用.def 文件吗?

我们可以看看你的编译命令行吗?

Are you actually using the .def file?

Can we see your command line to compile?

離殇 2024-08-22 01:19:18

抱歉,我修好了。当我将命令行复制到我的问题中时,即使我已经设置了发布配置,我也看到了 /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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文