C++ 中导出的函数中有多少下划线('_')

How many underscores ('_') in the exported function in C++

我在 Visual Studio 2015 年构建了一个 dll 项目。我使用 .def 文件导出函数。但是我无法理解编译器如何为我的函数添加下划线 (_) 前缀。在某些地方它添加了 1 个下划线,在某些地方添加了 2 个,甚至在某些地方添加了 3 个。

我的代码中有一个名为 Object() 的函数,为此 Visual Studio 似乎生成了很多版本,例如 __imp____Object__imp___Object__imp__Object。搞不懂为什么这么多版本

我面临的问题是,即使我在我的 .def 文件中添加了 ___Object__Object,我仍然收到以下链接器错误:

error LNK2001: unresolved external symbol __imp___Object

任何建议,这里发生了什么。

编译器似乎遵循一种模式来装饰这些导出的函数。在 x86 平台上,每个通过 .def file__declspec(dllexport) 导出的函数都有 _cdecl calling convention.lib 文件包含 2 个条目。一个作为函数名,前缀为 _,另一个前缀为 __imp__

例如,如果 def file 有一个导出函数 Function1 lib 将有 _Function1__imp__Function1

这将因 x64 和其他函数调用约定而异。

综上所述,我的情况比较特殊。我的 def 文件有 Object_Object__Object,它们应该导致 _Object__imp__Object__Object__imp___Object___Object__imp____Object.

现在从上面的列表中,第二个实际名称 (_Object) 和第一个生成的名称相同,因此它跳过了为第二个名称生成符号。因此我收到 link 错误:

error LNK2001: unresolved external symbol __imp___Object