Как найти причину этой ошибки компоновщика?
-
21-09-2019 - |
Вопрос
После длительного процесса переименования проекта мой проект 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