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

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


person Qwertie    schedule 18.01.2010    source источник


Ответы (4)


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

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

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

person Hans Passant    schedule 18.01.2010
comment
Вы также можете найти информацию о библиотеке времени выполнения, используемой для компиляции и компоновки, в узле C ++ / Code Generation свойств проекта для любого из ваших проектов в среде IDE. - person ReWrite; 18.01.2010
comment
Вы, наверное, правы. Я забыл про шестую библиотеку, которую получил от другого разработчика. Кажется, что сборка Release сработала, потому что Visual Studio случайным образом решила использовать для нее динамическое связывание (несмотря на мой запрос на статическое связывание), в то время как сборка Debug пыталась использовать статическое связывание (вызывая ошибку компоновщика при связывании с библиотекой). - person Qwertie; 19.01.2010
comment
Спасибо, что упомянули управление памятью как потенциальную проблему, но в моем случае это не должно быть проблемой, потому что моя DLL - это COM-DLL. Фактически, мое приложение заменяет глобальные операторы new и delete настраиваемым диспетчером памяти, но это не проблема для клиентов, поскольку COM изолирует управление памятью. - person Qwertie; 19.01.2010
comment
На самом деле он не централизует его. CoTaskMemAlloc и интерфейс IMalloc. - person Hans Passant; 11.02.2010
comment
COM-объекты выделяют и освобождают себя AFAICT; На самом деле я никогда не использовал CoTaskMemAlloc. COM, безусловно, централизует управление строковой памятью (SysAllocString / SysFreeString) - person Qwertie; 01.05.2013

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

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

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

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

person Roman Starkov    schedule 09.02.2010

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

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

person Goz    schedule 18.01.2010

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

person Elvis Dukaj    schedule 12.04.2013