C++ DLL 导出 : Decorated/Mangled names

标签 c++ dll export name-decoration

使用模块定义文件 (MyDLL.def) 创建基本 C++ DLL 并导出名称。 编译后,我使用 dumpbin.exe 检查导出的函数名称 我希望看到:

SomeFunction

但我看到的是这个:

SomeFunction = SomeFunction@@@23mangledstuff#@@@@

为什么?

导出的函数看起来没有修饰(特别是与不使用 Module Def 文件相比),但是其他的东西是怎么回事?

如果我对来自任何商业应用程序的 DLL 使用 dumpbin.exe,你会得到干净的:

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 一个模块定义,我会得到一个看似未修饰的函数名......唯一的问题是它被遵循由“=”和看起来像函数的修饰版本。我想摆脱“=”之后的东西 - 或者至少了解它为什么存在。

就目前而言,我很确定我可以使用 P/Invoke 从 C# 调用该函数...我只是想避免在“=”末尾出现垃圾。

我愿意接受有关如何更改项目/编译器设置的建议,但我只是使用了标准的 Visual Studio DLL 模板——没什么特别的。

最佳答案

不要使用 .def 文件,只需像这样插入 pragma comment

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

编辑:或者更简单:在函数体内使用

#pragma comment(linker, "/EXPORT:" __FUNCTION__"=" __FUNCDNAME__)

。 . .如果您在查找装饰函数名称时遇到问题。最后一个 pragma 可以通过一个简单的宏定义进一步简化。

关于C++ DLL 导出 : Decorated/Mangled names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2804893/

相关文章:

c++ - 将 std::atomic 与 futex 系统调用一起使用

c++ - VS2011代码分析

c++ - 如何使用 PathCreateFromUrlA API

c++ - 带有类和 DLL 的外部 "C"

c++ - 隐式链接 DLL 问题

csv - 将数据从 Cassandra 导出到 CSV 文件

java - 如何在 Eclipse 中导出 Java 游戏?

C++ 模板确定函数返回类型

c++ - 如何在Windows 2016 Server版本1607中访问SetThreadDescription()

java - 将 HashMap 逐个保存到文件