В vc \ lib есть 4 версии библиотек ссылок CRT:
- libcmt.lib: статическая библиотека ссылок CRT для сборки выпуска (/ MT)
- libcmtd.lib: статическая библиотека ссылок CRT для отладочной сборки (/ MTd)
- msvcrt.lib: библиотека импорта для версии DLL CRT (/ MD)
- msvcrtd.lib: библиотека импорта для отладочной DLL-версии CRT (/ MDd)
Посмотрите на параметры компоновщика, Project + Properties, Linker, Командная строка. Обратите внимание, что эти библиотеки не упоминаются здесь. Компоновщик автоматически определяет, какой ключ / M использовался компилятором и какой .lib должен быть связан с помощью директивы комментария #pragma. Очень важно, что вы получите ужасные ошибки ссылок и трудно диагностировать ошибки времени выполнения, если будет несоответствие между параметром / M и .lib, с которым вы ссылаетесь.
Вы увидите сообщение об ошибке, которое вы процитировали, когда компоновщик получит указание на ссылку на msvcrt.lib и libcmt.lib. Что произойдет, если вы свяжете код, который был скомпилирован с / MT с кодом, который был связан с / MD. Может быть только одна версия ЭЛТ.
/ NODEFAULTLIB говорит компоновщику игнорировать директиву комментария #pragma, сгенерированную из скомпилированного кода / MT. Это может сработать, хотя множество других ошибок компоновщика не редкость. Такие вещи, как errno , который является extern int в статической версии CRT, но макропрограммирован для функции в версии DLL. Многим другим это нравится.
Что ж, исправьте эту проблему Правильным путем, найдите файл .obj или .lib, на который вы ссылаетесь, который был скомпилирован с неправильной опцией / M. Если у вас нет подсказки, вы можете найти ее, выбрав .obj / .lib файлы для "/ MT"
Кстати: исполняемые файлы Windows (например, version.dll) имеют свою собственную версию CRT, чтобы выполнить свою работу. Он находится в каталоге c: \ windows \ system32, вы не можете надежно использовать его для своих собственных программ, его заголовки CRT нигде не доступны. DLL-библиотека CRT, используемая вашей программой, имеет другое имя (например, msvcrt90.dll).
/verbose:lib
к дополнительным опциям компоновщика. Он показывает порядок загрузки файловЭто означает, что один из зависимых dll скомпилирован с другой библиотекой времени выполнения .
Проект -> Свойства -> C / C ++ -> Генерация кода -> Библиотека времени выполнения
Просмотрите все библиотеки и убедитесь, что они скомпилированы одинаково.
Подробнее об этой ошибке в этой ссылке:
предупреждение LNK4098: defaultlib "LIBCD" конфликтует с использованием других библиотек
источник
ИМО, эта ссылка от Йохая Тиммера была очень хорошей и актуальной, но больно читать. Я написал резюме.
Йохай, если ты когда-нибудь прочитаешь это, пожалуйста, посмотри записку в конце.
Для оригинального сообщения читать: предупреждение LNK4098: defaultlib "LIBCD" конфликтует с использованием других библиотек
ошибка
Смысл
Как решить
В последнем, как это упоминалось в оригинальном сообщении, могут возникнуть две общие проблемы:
В этих случаях убедитесь, что вы понимаете проблему и выбираете решение.
Примечание. Я хотел включить это краткое изложение ссылки Йохая Тиммера в его собственный ответ, но, поскольку у некоторых людей возникают проблемы с корректным рассмотрением изменений, мне пришлось написать это в отдельном ответе. сожалею
источник
Я получаю это каждый раз, когда хочу создать приложение на VC ++.
Щелкните правой кнопкой мыши проект, выберите «Свойства», затем в разделе «Свойства конфигурации | C / C ++ | Генерация кода », выберите« Многопоточная отладка (/ MTd) »для конфигурации отладки.
Обратите внимание, что это не меняет настройки для вашей версии выпуска - вам нужно перейти в то же место и выбрать «Многопоточность (/ MT)» для выпуска.
источник
Щелкните правой кнопкой мыши проект, выберите «Свойства», затем в разделе «Свойства конфигурации | Линкер | Вход | Игнорировать конкретную библиотеку и написать msvcrtd.lib
источник