Вопрос

После длительного процесса переименования проекта мой проект 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.

Это было полезно?

Решение

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

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

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

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

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

Проблема в том, что 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top