Проблема с компоновщиком библиотеки времени выполнения Visual C ++ - PullRequest
2 голосов
/ 01 июня 2009

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

У меня есть проект, который имеет 10 зависимостей. Сначала я скомпилировал с использованием параметра / MTD в разделе генерации кода C / C ++ в основном проекте, и все его зависимости успешно собираются.

Затем я изменил параметр с / MTD на / MDd, и снова все зависимые проекты получают построить успешно. Но для основного проекта сообщается о следующих ошибках:


LIBCMTD.lib(osfinfo.obj) : error LNK2005: __open_osfhandle already defined in MSVCRTD.lib(MSVCR80D.dll)

LIBCMTD.lib(lseeki64.obj) : error LNK2005: __lseeki64 already defined in MSVCRTD.lib(MSVCR80D.dll)


sqlite3x.lib(sqlite3x_command.obj) : error LNK2005: "protected: wchar_t * __thiscall std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> >::_Myptr(void)" (?_Myptr@?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@IAEPA_WXZ) already defined in msvcprtd.lib(MSVCP80D.dll)

MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __mkdir already defined in LIBCMTD.lib(mkdir.obj)

MSVCRTD.lib(MSVCR80D.dll) : error LNK2005: __strdup already defined in
LIBCMTD.lib(strdup.obj)

   Creating library Debug/Application.lib and object Debug/Application.exp
LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library

LINK : warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library

Как я могу это исправить?

Ответы [ 3 ]

5 голосов
/ 01 июня 2009

Вы не можете смешивать библиотеки времени выполнения C. Если у вас есть библиотека или объект, скомпилированный / MT (что угодно), вы не можете просто связать с / MD. Вам необходимо связать с поточным MSVCRT. Там нет, если и "или", но об этом. Вы НЕ МОЖЕТЕ смешивать время выполнения C. Я всегда считал лучшим, даже в программах, которые не выполняют многопоточность, просто использовать / MT.

Запускали ли вы операцию очистки проекта для удаления уже созданных объектов и библиотек? У вас также есть зависимость от SQLite, вы тоже ее перестроили?

1 голос
/ 01 июня 2009

Когда несколько статических библиотек c ++ связаны между собой, все они должны иметь / MTD или все они должны иметь /MDd. Вы не можете связать проект с / MTD с другим проектом с / MDd

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

Я помню, у меня когда-то была такая же проблема с / MTD и / MDd, и у меня были очень похожие ошибки.

0 голосов
/ 09 февраля 2010

Мой ответ здесь может помочь, связавшись с некоторыми статьями MSDN, которые я нашел очень полезными для решения моей версии этой проблемы.

...