Как мне найти причину этой ошибки компоновщика?

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

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 ответа

Решение

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам