我尝试使用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链接器错误。
答案 0 :(得分:0)
至少从Visual Studio 2003(!),"The __int8 data type is synonymous with type char"开始。
显然,编译器可以通过两种方式命名相同类型的名称不同。
同样富有洞察力的是this page,它表明__int8
是(已签名)char
,但__int64
不是 long long
;后者仅仅是等同的。