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

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

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

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

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

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

Параметры Debug / Release, Многопоточный / Однопоточный и Статический / DLL. Только шесть из восьми возможных комбинаций покрыты. Не существует однопоточной DLL, ни Debug, ни Release.

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

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

Ответы на вопрос(1)

Ваш ответ на вопрос