Как мне найти причину этой ошибки компоновщика? - PullRequest
1 голос
/ 18 января 2010

После длительного процесса переименования проекта мой проект DLL не будет собран в режиме отладки (Выпуск сборок работает):

MSVCRTD.lib(msvcr90d.dll) : error LNK2005: _CrtDbgReportW already defined in LIBCMTD.lib(dbgrpt.obj)

Этот проект и пять статических библиотек, от которых он зависит,настроены на использование «Многопоточной отладки (/ MTd)» (в C / C ++ | Генерация кода | Библиотека времени выполнения).Я полагаю, что LIBCMTD.lib предназначен для многопоточной отладки, но что такое MSVCRTD.lib и что может быть причиной этой ошибки?

Если это имеет значение, эта DLL предназначена для Windows CE.

Ответы [ 4 ]

5 голосов
/ 18 января 2010

LIBCMT - это то, что вам нужно для / MT, MSVCRT - это то, что вам нужно для / MD.Вы связываете смешанные файлы .obj и .lib, некоторые скомпилированы с / MT, некоторые с / MD.Это нехорошо.

Обычно проблема заключается в файлах .lib.Просмотрите их параметры сборки и убедитесь, что их параметр / M совпадает с вашим проектом DLL.

Также остерегайтесь проблем, с которыми вы можете столкнуться, если DLL была скомпилирована с / MT.У вас будут большие проблемы, когда DLL вернет указатели на объекты, которые клиент должен освободить.Не может, не использует тот же распределитель памяти.

1 голос
/ 09 февраля 2010

В статье MSDN по LNK4098 есть очень полезная таблица: в ней указывается, какие библиотеки нужно вручную добавить в список «Игнорировать определенную библиотеку», в зависимости от того, какую CRT вы используете. В вашем случае вы должны игнорировать все это:

libc.lib, libcmt.lib, msvcrt.lib, libcd.lib, libcmtd.lib

Обратите внимание, что указанная библиотека также находится в этом списке. Эта проблема более подробно описана в библиотеках KB154753 ..., с которыми программа будет связываться при сборке с использованием Visual C ++

Моя интерпретация этого заключается в том, что в определенных ситуациях алгоритм, который автоматически выбирает, с какими библиотеками CRT связать ваш код, выберет несколько конфликтующих библиотек.

0 голосов
/ 12 апреля 2013

Проблема в том, что msvcr90d.dll нет в образе windows ce.Он должен быть развернут с приложением.Msvcr90d.dll находится в $ (VCInstallDir) / ce / bin / $ (ARCHFAM).

http://stackoverflow.com/questions/15959877/windows-ce-6-0-and-runtime-link-to-debug-dll-mdd

0 голосов
/ 18 января 2010

Что такое релиз? Установка многопоточной отладки DLL может вызвать проблемы, если вы выделяете память, которую пытается освободить то, что обращается к DLL (например, они будут размещены в разных кучах). Попробуйте установить многопоточную отладочную DLL.

Возможно, ваша проблема со связью возникает из-за того, что библиотека, на которую вы ссылаетесь, ожидает многопотоковую отладочную DLL, поэтому компоновщик пытается связать обе, и ваша ссылка не работает ...

...