2010-01-18 3 views
1

После прохождения через длительный процесс переименования проекта, мой DLL проект не будет строить в режиме отладки (Release строит работу):Как я могу найти причину ошибки компоновщика?

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

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

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

ответ

5

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

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

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

+0

Вы также можете найти сведения о которая используется для компиляции и связывания в узле C++/Code Generation свойств проекта для любого из ваших проектов в среде IDE. – ReWrite

+0

Возможно, вы правы. Я забыл о шестой библиотеке, которую получил у другого разработчика. Похоже, что сборка Release работала, потому что Visual Studio случайно решила использовать динамическую ссылку для нее (несмотря на мой запрос на статическую привязку), в то время как сборка Debug пыталась использовать статическое связывание (вызывая ошибку компоновщика при связывании с библиотекой). – Qwertie

+0

Спасибо за упоминание управления памятью как потенциальную проблему, но это не должно быть проблемой в моем случае, потому что моя DLL - это COM-библиотека.Фактически, мое приложение заменяет глобальных операторов новыми и удаляет с помощью специального менеджера памяти, но это не проблема для клиентов, поскольку COM изолирует управление памятью. – Qwertie

0

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

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

1

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

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

Обратите внимание, что указанная библиотека также находится в этом списке. Проблема описана более подробно в KB154753 ... libraries that a program will link with when built by using Visual C++

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

0

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

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

Смежные вопросы