2010-10-07 3 views
4

Я интегрируя 3-й код партии в моем MFC приложение под Visual Studio 2010.
Когда в режиме отладки следующая ошибка сборки происходит:Visual Studio - LNK2005 ошибки в режиме отладки

1>LIBCMT.lib(invarg.obj) : error LNK2005: __initp_misc_invarg already defined in libcmtd.lib(invarg.obj) 
1>LIBCMT.lib(invarg.obj) : error LNK2005: __call_reportfault already defined in libcmtd.lib(invarg.obj) 
1>LIBCMT.lib(invarg.obj) : error LNK2005: __set_invalid_parameter_handler already defined in libcmtd.lib(invarg.obj) 
1>LIBCMT.lib(invarg.obj) : error LNK2005: __get_invalid_parameter_handler already defined in libcmtd.lib(invarg.obj) 
1>LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in libcmtd.lib(invarg.obj) 
1>LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invoke_watson(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" ([email protected]@[email protected]) already defined in libcmtd.lib(invarg.obj) 
1>LIBCMT.lib(invarg.obj) : error LNK2005: __invalid_parameter already defined in libcmtd.lib(invarg.obj) 
1>LIBCMT.lib(invarg.obj) : error LNK2005: "void __cdecl _invalid_parameter(unsigned short const *,unsigned short const *,unsigned short const *,unsigned int,unsigned int)" ([email protected]@[email protected]) already defined in libcmtd.lib(invarg.obj) 
1>LIBCMT.lib(invarg.obj) : error LNK2005: ___pInvalidArgHandler already defined in libcmtd.lib(invarg.obj) 
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library 
1>D:\My Documents\Dev\MyProject\MyProject\Debug\MyProject.exe : fatal error LNK1169: one or more multiply defined symbols found 

Использование this advice я был в состоянии для завершения сборки двумя способами:

  • в режиме выпуска
  • в режиме отладки, используя/FORCE: множественность в качестве опции дополнительной командной строке компоновщика

Во втором случае (режим отладки) по-прежнему сообщается о многих предупреждениях. Если я также добавлю/NODEFAULTLIB: LIBCMT, большинство из них исчезло.

В чем причина этого?
Как я могу решить это, а не работать вокруг него?

ответ

10

По какой-то причине вы связываетесь как с LIBCMT, так и с LIBCMTD (версия отладки). (От чтения конца каждой строки ошибки: already defined in libcmtd.lib(invarg.obj))

Вы исправляете правильную вещь, говоря/NODEFAULTLIB: LIBCMT. Включен ли флаг debug/release в сторонней библиотеке, который вы связываете, с режимом отладки/выпуска в вашей сборке приложений? Я бы предположил, что сторонний код каким-то образом вытаскивает избыточную библиотеку.

+0

У меня есть код для большей части стороннего пакета. Где я могу найти флаг debug/release? Может быть, это скомпилированная dll, которую я мог бы иметь с пакетом? – Jonathan

0

Если вам повезет, ваш сторонний пакет содержит xxx.lib, а также xxxD.lib, как и для LIBCMT. Тогда вам просто нужно связать соответствующий по версии release/debug. Работал для меня в аналогичном случае.

0

Я решил такую ​​же проблему следующим образом: В обозревателе решений> Параметры конфигурации> C/C++> Генерация кода. В поле Runtime Library выберите .... для моего «стороннего кода» мне пришлось выбрать Multi-threaded (/ MTd), и он сработал.

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