Конфликтующие библиотеки времени выполнения в MSVC/VS2012
Я знаю: это уже было решено, но после прочтения столько, сколько я мог об этом, я все еще не мог понять, почему я не смог это исправить, или что исправить даже.
В соответствии с этим, вы видите, что будут проблемы, если ваш проект использует две разные стандартные библиотеки времени выполнения для компиляции одновременно. Наиболее распространенными из них являются libcmt.lib и msvcrt.lib, а также их отладочные эквиваленты.
По-видимому, мой проект использует оба из них, следовательно, следующие предупреждения, которые появляются вместе:
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>glew32s.lib(glew.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'glew32s.lib(glew.obj)' or at 'C:\Programming\VS\Play_VS\Debug\vc100.pdb'; linking object as if no debug info
Как вы можете видеть, я использую глю для этого. Код компилируется без каких-либо ошибок, но тот факт, что я использую только внешние библиотеки GLEW/GLFW/GLU/GLM, заставляет задуматься, есть ли какие-либо проблемы конфигурации, которые могут присутствовать в моей текущей сборке. Я не использую MFC или ATL или любую другую библиотеку Visual C++, кроме их собственной реализации STL.
Прежде всего, я скажу, что я пытался установить свойства моего проекта из Multi-Threaded [Debug] DLL
в Multi-Threaded [Debug]
что, кажется, усугубляет ситуацию, создавая следующий вывод:
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _free already defined in LIBCMTD.lib(dbgfree.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _malloc already defined in LIBCMTD.lib(dbgmalloc.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _fprintf already defined in LIBCMTD.lib(fprintf.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: ___iob_func already defined in LIBCMTD.lib(_file.obj)
1>MSVCRT.lib(MSVCR110.dll) : error LNK2005: _strchr already defined in LIBCMTD.lib(strchr.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)
1>MSVCRT.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) already defined in LIBCMTD.lib(typinfo.obj)
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
1>C:\Programming\VS\Play_VS\Debug\Play_VS.exe : fatal error LNK1169: one or more multiply defined symbols found
Аналогично, просмотр моих флагов компиляции для сборок Debug и Release говорит мне, что /MT
(libcmt.lib) не существует ни в одном из входов генерации команд. Насколько я знаю, большинство людей, пишущих родные приложения на C++ в Windows, используют /MD
т.е. msvcrt.lib
,
Ввод отладочной сборки
/GS /analyze- /W3 /Zc:wchar_t /ZI /Gm /Od /Fd"Debug\vc110.pdb" /fp:precise /D "GLEW_STATIC" /D "_CRT_SECURE_NO_WARNINGS" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /RTC1 /GR /Gd /Oy- /MDd /Fa"Debug\" /EHsc /nologo /Fo"Debug\" /Fp"Debug\Play_VS.pch"
Освободить входные данные сборки
/GS /GL /analyze- /W3 /Gy /Zc:wchar_t /Zi /Gm- /O2 /Fd"Release\vc110.pdb" /fp:precise /D "_CRT_SECURE_NO_WARNINGS" /D "_MBCS" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /Oi /MD /Fa"Release\" /EHsc /nologo /Fo"Release\" /Fp"Release\Play_VS.pch"
Как я могу это исправить? Я ценю помощь.
1 ответ
Вы смешиваете код, который был скомпилирован с /MD (используйте DLL-версию CRT) с кодом, который был скомпилирован с /MT (используйте статическую библиотеку CRT). Это не может работать, все файлы исходного кода должны быть скомпилированы с одинаковыми настройками. Учитывая, что вы используете библиотеки, предварительно скомпилированные с /MD, почти всегда правильные настройки, вы должны также скомпилировать свой собственный код с этим параметром.
Project + Properties, C / C++, генерация кода, библиотека времени выполнения.
Помните, что эти библиотеки, вероятно, были скомпилированы с более ранней версией CRT, msvcr100.dll является довольно новой. Не уверен, что это вызовет проблемы, возможно, вам придется запретить компоновщику генерировать манифест. Вы также должны убедиться, что развернули необходимые библиотеки DLL на целевом компьютере, включая msvcr100.dll.
есть та же проблема: ошибка LNK2005: xxx уже определен в MSVCRT.lib(MSVCR100.dll) C:\thing\LIBCMT.lib(setlocal.obj)