2014-02-25 3 views
0

Я использую MS Visual Studio 2012 и пытаюсь использовать динамическую связанную библиотеку, которую я сам не написал. Я могу определить что-то Foo * foo; и все нормально, пока я не создаю новый объект, используя Foo * foo = new Foo (params); я получаю целый список ошибок:ошибка LNK2005 на внешней dll

1>LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in MSVCRTD.lib(MSVCR110D.dll) 
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library 
1>cyclone.lib(pworld.obj) : 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> >::erase(unsigned int,unsigned int)" ([email protected][email protected][email protected]@[email protected]@[email protected]@[email protected]@[email protected]@[email protected]@Z) 
1>cyclone.lib(pfgen.obj) : error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xran(void)" ([email protected][email protected]@@SAXXZ) 
1>cyclone.lib(pworld.obj) : 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]) 
1>cyclone.lib(pfgen.obj) : error LNK2001: unresolved external symbol "public: static void __cdecl std::_String_base::_Xlen(void)" ([email protected][email protected]@@SAXXZ) 
1>C:\Users\deleo\Documents\Visual Studio 2012\Projects\AdvancedPhysics - Copy\Debug\AdvancedPhysics.exe : fatal error LNK1120: 2 unresolved externals 
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ========== 

Так что я не могу изменить любой код самой библиотеки DLL.

Я использую единственный #include (и я посмотрел файл, если он защищен #ifndef). Кто-нибудь знает, почему эта ошибка возникает и как ее исправить?

+0

Это не ошибки компоновщика, которые вы получаете от использования DLL, вы получаете их от использования статической библиотеки. Это было построено с грубо несовместимыми настройками, а не только для библиотеки времени исполнения (/ MD vs/MT), а также другой версии стандартной библиотеки C++. Что сильно изменилось благодаря C++ 11. Вы не можете использовать эту библиотеку как есть, ее нужно перестроить. Если у вас нет источника, обратитесь к владельцу и попросите обновить его. –

+0

Спасибо за ответ Ганс, у меня есть оригинальные файлы. Я думаю, что исходная версия была построена с использованием Visual Studio 2008, и я использую 2012 год. Если я перестрою .dlls, используя VS 2012, разрешит ли это проблему? – GeekPeek

ответ

0

Ваш проект и связанные библиотеки должны использовать ту же версию VC++ и те же параметры компилятора. Вы можете использовать средство просмотра PE (Portable Executable) для просмотра версии компоновщика, чтобы определить версию компилятора, которая использовала для компиляции этой DLL.

Если ваша версия компилятора такая же, как у DLL. Попробуйте установить Runtime Library в Project > Properties > Configuration Properties > C/C++ > Code Generation на MT или MTd.

+0

Я установил Runtime Library в MTd, но все равно получаю некоторые ошибки (LNK2019 и LNK2001 на этот раз). Как проверить параметры компилятора? – GeekPeek

+0

Невозможно проверить параметры компилятора. Но похоже, что ваша DLL использовала разную версию VC++. Вы проверили версию компоновщика? если нет, убедитесь, что ваша DLL использует ту же версию VC++, что и ваш проект. – UltimaWeapon

Смежные вопросы