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

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

本文关键字:C++ 下划线 函数 多少      更新时间:2023-10-16

我在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则库将具有_Function1__imp__Function1

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

综上所述,我的案例很特殊。我的def文件有Object_Object__Object,这应该导致_Object__imp__Object__Object__imp___Object___Object__imp____Object

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

错误 LNK2001:未解析的外部符号__imp___Object