Подтвердить что ты не робот

Runtime Library mis-matches и VС++ - О, страдание!

Кажется, что всю мою взрослую жизнь меня мучил компоновщик VС++, жалующийся или запрещающий, потому что разные библиотеки не согласны с тем, какую версию библиотеки Runtime использовать. Я никогда не в состоянии справиться с этим мрачным предметом. Поэтому я просто пытаюсь с ним поработать, пока это не сработает. Сообщения об ошибках никогда не будут полезны. Ни документация Microsoft по этому вопросу, ни по крайней мере не для меня.

Иногда он не находит функции - потому что искажение имен - это не то, что ожидалось? Иногда он отказывается смешивать-и-матч. В других случаях он просто говорит: "LINK: предупреждение LNK4098: defaultlib" LIBCMTD "конфликтует с использованием других libs; use/NODEFAULTLIB: library" Использование /NODEFAULTLIB не работает, но предупреждение кажется доброкачественным. Какая черта "DEFAULTLIB"? Как решает компоновщик? Я никогда не видел способа указать компоновщику, какую библиотеку времени выполнения использовать, только как сообщить компилятору, в какую библиотеку создавать вызовы функций.

Существуют программы "зависимых ходок", которые могут проверять объектные файлы, чтобы увидеть, от какой DLL они зависят. Я просто побежал в проекте, который я пытаюсь построить, и это настоящий беспорядок. Существуют системные .libs и .dll, которые хотят иметь конфликтующие версии времени исполнения. Например, COMCTL32.DLL хочет MSVCRT.DLL, но я связываюсь с MSVCRTD.DLL. Я ищу, чтобы увидеть, есть ли COMCTL32D.DLL, даже когда я печатаю.

Итак, я думаю, что я прошу, это учебник о том, как сортировать эти вещи. Что вы делаете, и как вы это делаете?

Вот что я думаю, что знаю. Пожалуйста, исправьте меня, если что-то не так.

  • Параметрами являются Debug/Release, Multi-threaded/Single-threaded и static/DLL. Только шесть из восьми возможных комбинаций покрыты. Нет однопоточной DLL, либо Debug, либо Release.

  • Настройки влияют только на то, к какой библиотеке времени выполнения привязаны (и соглашение о вызове для связи с ней). Например, вы не должны использовать среду выполнения на основе DLL, если вы создаете DLL, и вам не нужно использовать версию времени выполнения Debug при создании версии программы Debug, хотя, похоже, преодолевая системные вызовы.

Бонусный вопрос: как может любой или любая компания создать такой беспорядок?

4b9b3361

Ответ 1

Ваши баллы (1) и (2) выглядят правильно для меня. Другое замечание (2) заключается в том, что ссылка на отладочный CRT также дает вам доступ к таким вещам, как расширенная проверка кучи, проверенные итераторы и другие различные проверки работоспособности. Однако вы не можете распространять отладочный CRT с вашим приложением, но вы должны отправить его только с помощью сборки релиза. Это не только требуется лицензия VC, но вы, вероятно, не хотите, чтобы в любом случае отправляли файлы отладки.

Нет такой вещи, как COMCTL32D.DLL. Библиотеки DLL, входящие в состав Windows, должны загружать CRT, с которым они были связаны, когда была установлена ​​Windows - это включено в ОС как MSVCRT.DLL. Этот Windows CRT полностью независим от CRC Visual С++, который загружается модулями, входящими в вашу программу (MSVCRT.DLL - это тот, который поставляется с Windows. VC CRT будет содержать номер версии, например MSVCRT80.DLL). Только файлы EXE и DLL, которые составляют вашу, зависят от многопоточных/однопоточных настроек debug/release.

Лучшей практикой здесь является ИМО, чтобы выбрать настройку для вашего ЭЛТ и стандартизировать ее для каждого бинарного файла, который вы отправляете. Я бы лично использовал многопоточную среду выполнения DLL. Это связано с тем, что Microsoft может (и делает) выпускать обновления безопасности и исправления ошибок для CRT, которые могут быть вытолкнуты через Центр обновления Windows.