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

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

error LNK2019: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" ([email protected][email protected]@@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)" ([email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected])

error LNK2019: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" ([email protected][email protected]@@SAXXZ) referenced in function "protected: bool __thiscall std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >::_Grow(unsigned int,bool)" ([email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected])

Я опубликовал эту проблему в Интернете и нашел аналогичную запись в этом адресе: http://social.msdn.microsoft.com/Forums/en/vcgeneral/thread/5ac28a31-3339-4db1-90f4-68edad360309

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

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

Ответы

Ответ 1

Вероятнее всего, проблема связана с тем, что одна из библиотек, с которыми работает ссылка .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).

Ответ 2

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

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

  • visual studio 2010 - vc100.
  • visual studio 2008 - vc90.
  • visual studio 2005 - vc80.

Ответ 3

Столкнулась с такой же проблемой, что и с 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");
}

Ответ 4

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

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

visual studio 2010 - vc100. visual studio 2008 - vc90. visual studio 2005 - vc80.

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