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
我在 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