为不正确生成的函数装饰名称

时间:2017-05-12 17:17:11

标签: c++ visual-studio visual-studio-2017 name-decoration

我尝试使用Visual Studio 2017(从Visual Studio 6.0升级)将一些第三方C ++代码编译到我的32位C ++应用程序中。我有来自第三方的.h文件和.lib文件。链接器正在查找库,但它没有找到包含在其中的修饰名称。这似乎是因为编译器正在替换" __ int8"与" char"。

链接器错误是:

LNK2019   unresolved external symbol "signed char __cdecl Check_The_Thing(void)" (?Check_The_Thing@@YACXZ) referenced in function (redacted)

该功能在.h:

中定义
_declspec(dllexport) API_RETURN_TYPE  Check_The_Thing ( void );

API_RETURN_TYPE在.h:

中定义
_declspec(dllimport)   typedef signed   __int8   int_8;
_declspec(dllimport)   typedef          int_8    API_RETURN_TYPE;

使用dumpbin / exports,我可以看到我的lib和关联的dll导出Check_The_Thing:

?Check_The_Thing@@YA_DXZ (__int8 __cdecl Check_The_Thing(void))

使用undname,我可以看到lib中的装饰名称正确评估:

Undecoration of :- "?Check_The_Thing@@YA_DXZ"
is :- "__int8 __cdecl Check_The_Thing(void)"

但是编译器生成的修饰名称没有正确评估(基于代码):

Undecoration of :- "?Check_The_Thing@@YACXZ"
is :- "signed char __cdecl Check_The_Thing(void)"

根据https://en.wikiversity.org/wiki/Visual_C%2B%2B_name_mangling," C"在YACXZ评估"签署的字符"和" _D"评估为" __ int8"。我无法弄清楚为什么编译器将API_RETURN_TYPE解释为" char"而不是" __ int8"。很明显,lib / dll导出应该有" _C"而不是" _D"鉴于API_RETURN_TYPE是"签名__int8"不只是" __ int8"。

我已经摆弄了一堆编译器设置而没有运气。正如这里建议的那样(Cannot find decorated function name in dll),我确定我使用的是MBCS而不是Unicode(之前没有设置过),但这也没有区别。

具体地将API_RETURN_TYPE定义为__int8没有区别,除了更改" C"到了" D" (进度!)和同样的undname显示返回类型为" char"而不是"签名char"。将函数定义的返回类型更改为__int8与更改API_RETURN_TYPE具有相同的效果。

所以,我的问题:如何强制编译器使用" __ int8"正确定义我的导出? (或" _D")而不是char(" D")?

附注:对于使用__int16,__ int32和__int64的情况,链接器错误是相同的。

编辑:实际上,库定义了__int64类型,但我没有使用任何类型。没有__int64链接器错误。

1 个答案:

答案 0 :(得分:0)

至少从Visual Studio 2003(!),"The __int8 data type is synonymous with type char"开始。

显然,编译器可以通过两种方式命名相同类型的名称不同。

同样富有洞察力的是this page,它表明__int8是(已签名)char,但__int64 不是 long long;后者仅仅是等同的。