从VS2008更新到VS2010后链接错误

时间:2010-05-24 11:54:51

标签: visual-studio-2010 visual-studio-2008 linker-errors lnk2019

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

但这些答案都不能解决我的问题。谁能给我一些如何解决这个问题的技巧?

非常感谢您的帮助!

4 个答案:

答案 0 :(得分:14)

问题很可能是您的.exe链接的库之一是使用以前版本的Visual Studio构建的。因为这个“其他”库是使用以前版本的VS编译的,所以它正在寻找VS2010 C运行时中函数_XRan和_XLen的先前版本。 MS已经更改了它们(又一次),它们在VS2010运行时中不存在旧功能签名。

old:public:static void __cdecl std :: _ St​​ring_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)

转到您的项目设置:

配置属性  常规 - 平台工具集

  1. visual studio 2010 - vc100。
  2. visual studio 2008 - vc90。
  3. visual studio 2005 - vc80。

答案 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。”