从VS2008更新到VS2010后链接错误

Cai*_*hua 15 linker-errors visual-studio-2010 lnk2019 visual-studio-2008

今天我在从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)
Run Code Online (Sandbox Code Playgroud)

我在网上搜索了这个问题,并在这个地址找到了类似的帖子:http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309

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

非常感谢您的帮助!

Jes*_*ess 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实现并在链接器中覆盖(参见http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309中的 JN123的说明).


Dmi*_*hin 5

2008 年到 2012 年的迁移也遇到了同样的问题。看来 MS 仍在使用这些函数的签名。我的决定只是给链接器它想要的东西。我已将下一个代码放入项目的 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");
}
Run Code Online (Sandbox Code Playgroud)