Ошибка связи после обновления с 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 установлен на компьютере."