Ошибка ссылки после обновления с VS2008 до VS2010

Сегодня столкнулся с проблемой линковки после обновления версии 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

Но ни один из этих ответов не может решить мою проблему. Может ли кто-нибудь дать мне несколько советов о том, как решить эту проблему?

Большое спасибо за помощь!


person Caihua    schedule 24.05.2010    source источник
comment
Специально для этой ошибки компоновщика Xran и Xlen — это две функции, которые существуют в версии std::basic_string для VS2008, но НЕ существуют в версии VS2010. Поэтому при попытке слинковать эту библиотеку в VS2010 не может найти эти функции и вызывает ошибку.   -  person Philip    schedule 06.02.2014


Ответы (4)


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

старый: общедоступный: статический недействительный __cdecl std::_String_base::_Xran (пустой)

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).

person Jess    schedule 21.06.2010

Столкнулся с той же проблемой при переходе с 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");
}
person Dmitry Ilukhin    schedule 26.08.2014

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

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

  1. визуальная студия 2010 – vc100.
  2. визуальная студия 2008 – vc90.
  3. визуальная студия 2005 - vc80.
person barryjones    schedule 03.01.2012
comment
Что это делает? Чем это лучше, чем ответ Джесс? У меня есть эта проблема, и я не знаю, как ее решить. - person Tim; 09.08.2012
comment
Выбор набора инструментов платформы той версии, в которой проект был до обновления, у меня сработал. - person Denise Skidmore; 22.05.2018

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

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

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

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

person af.    schedule 08.01.2012