Несоответствия Библиотеки времени выполнения и VC ++ - О, страдание!

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

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

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

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

Вот то, что я думаю, что знаю. Исправьте меня, если какое-либо из этого является неправильным.

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

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

Вопрос о премии: Как кто-либо или какая-либо компания могли создать такую путаницу?

12
задан Jive Dadson 2 March 2010 в 01:25
поделиться

1 ответ

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

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

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

3
ответ дан 2 December 2019 в 23:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: