Ошибка связи после обновления с VS2008 до VS2010 - PullRequest
15 голосов
/ 24 мая 2010

Сегодня я столкнулся с проблемой связывания после обновления версии VS с 2008 по 2010 год, ошибка примерно такая:

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 ]

14 голосов
/ 22 июня 2010

Скорее всего, проблема в том, что одна из библиотек, на которую ссылается ваш .exe, была создана в предыдущей версии Visual Studio.Поскольку эта «другая» библиотека была скомпилирована с предыдущей версией VS, она ищет предыдущие версии функций _XRan и _XLen во время выполнения VS2010 C.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).

3 голосов
/ 26 августа 2014

Столкнулся с той же проблемой при переносе с 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");
}
3 голосов
/ 04 января 2012

Перейти к настройкам вашего проекта:

Свойства конфигурации Общее - Набор инструментов платформы

  1. visual studio 2010 - vc100.
  2. visual studio 2008 - vc90.
  3. visual studio 2005 - vc80.
1 голос
/ 08 января 2012

Перейти к настройкам вашего проекта:

Свойства конфигурации Общие - Набор инструментов платформы

Визуальная студия 2010 - vc100. Визуальная студия 2008 - vc90. visual studio 2005 - vc80.

Для этого требуются все версии Visual Studio, установленные в вашей системе. В противном случае вы получите такую ​​ошибку: «Для указанного набора инструментов платформы (v90) требуется Visual Studio 2008. Убедитесь, что на компьютере установлена ​​Visual Studio 2008».

...