今天我在2008年到2010年更新VS版本后遇到链接问题,错误是这样的:
error LNK2019: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" (?_Xran@_String_base@std@@SAXXZ) referenced in function "public: class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > & __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::assign(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,unsigned int,unsigned int)" (?assign@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@QAEAAV12@ABV12@II@Z)
error LNK2019: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" (?_Xlen@_String_base@std@@SAXXZ) referenced in function "protected: bool __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Grow(unsigned int,bool)" (?_Grow@?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@IAE_NI_N@Z)
我在网上搜索了这个问题,并在此地址中找到了类似的帖子:http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309
但这些答案都不能解决我的问题。谁能给我一些如何解决这个问题的技巧?
非常感谢您的帮助!
答案 0 :(得分:14)
问题很可能是您的.exe链接的库之一是使用以前版本的Visual Studio构建的。因为这个“其他”库是使用以前版本的VS编译的,所以它正在寻找VS2010 C运行时中函数_XRan和_XLen的先前版本。 MS已经更改了它们(又一次),它们在VS2010运行时中不存在旧功能签名。
old:public:static void __cdecl std :: _ String_base :: _ Xran(void)
new:public:void __thiscall std :: basic_string :: _ Xran(void)(这可能是错的,但你明白了)
有三种可能的解决方法:
1)使用VS 2010编译所有库
2)使用旧版本的VS编译代码
3)重写现有的_XRan和_XLen实现并在链接器中覆盖(参见JN123在http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309中的解释)。
答案 1 :(得分:3)
转到您的项目设置:
配置属性 常规 - 平台工具集
答案 2 :(得分:3)
面临从2008年到2012年迁移的同样问题。似乎MS仍在玩这些功能&#39;签名。我的决定只是为链接器提供它想要的东西。我已经将下一个代码放入我的项目中了cpp和链接器被关闭了:
namespace std
{
class _String_base
{
public:
static void _cdecl _Xlen(void) ;
static void _cdecl _Xran(void) ;
};
};
void _cdecl std::_String_base::_Xlen(void)
{ // report a length_error
_Xlength_error("string too long");
}
void _cdecl std::_String_base::_Xran(void)
{ // report an out_of_range error
_Xout_of_range("invalid string position");
}
答案 3 :(得分:1)
转到您的项目设置:
配置属性常规 - 平台工具集
visual studio 2010 - vc100。 visual studio 2008 - vc90。 visual studio 2005 - vc80。
这需要在您的系统上安装所有这些visual studio版本。否则你会得到这样的错误: “指定的平台工具集(v90)需要Visual Studio 2008.请确保在计算机上安装了Visual Studio 2008。”