Visual Studio - ошибка LNK2005 в режиме отладки - PullRequest
5 голосов
/ 08 октября 2010

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

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)" (?_invoke_watson@@YAXPBG00II@Z) 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)" (?_invalid_parameter@@YAXPBG00II@Z) 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

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

  • В режиме разблокировки
  • В режиме отладки с использованием параметра / FORCE: MULTIPLE в качестве дополнительного параметра командной строки компоновщика

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

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

Ответы [ 3 ]

11 голосов
/ 08 октября 2010

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

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

0 голосов
/ 11 октября 2012

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

0 голосов
/ 22 июня 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...