Похоже, что всю свою сознательную жизнь меня мучили жалобы или возражения компоновщика VC ++ из-за того, что различные библиотеки не договариваются о том, какую версию библиотеки времени выполнения использовать. Я никогда не в настроении осваивать этот мрачный предмет. Так что я просто пытаюсь возиться с этим, пока он не сработает. Сообщения об ошибках бесполезны. В документации Microsoft по этому поводу тоже нет - по крайней мере, для меня.
Иногда он не находит функции - потому что изменение имени не то, что ожидалось? Иногда он отказывается смешивать и сочетать. В других случаях он просто говорит: «ССЫЛКА: предупреждение LNK4098: defaultlib 'LIBCMTD' конфликтует с использованием других библиотек; использование / NODEFAULTLIB: библиотека» Использование / NODEFAULTLIB не работает, но предупреждение кажется безобидным . Что, черт возьми, такое "DEFAULTLIB"? Как решает компоновщик? Я никогда не видел способа указать компоновщику, какую библиотеку времени выполнения использовать, только как сообщить компилятору, для какой библиотеки создавать вызовы функций.
Существуют программы «обходчика зависимостей», которые могут проверять объектные файлы, чтобы увидеть, от каких DLL они зависят. Я только что запустил один в проекте, который пытаюсь создать, и это настоящий беспорядок. Существуют системные библиотеки .lib и .dll, которым требуются конфликтующие версии среды выполнения. Например, COMCTL32.DLL требуется MSVCRT.DLL, но я связываюсь с MSVCRTD.DLL. Я ищу, есть ли COMCTL32D.DLL, даже когда я печатаю.
Итак, я думаю, что я прошу учебное пособие о том, как разобраться в этих вещах. Что вы делаете и как вы это делаете?
Вот что я знаю. Пожалуйста, поправьте меня, если что-то не так.
Параметры: Debug / Release, Multi-thread / Single-thread и static / DLL. Охватываются только шесть из восьми возможных комбинаций. Нет однопоточной DLL, ни отладки, ни выпуска.
Параметры влияют только на то, какая библиотека времени выполнения подключается (и соглашение о вызовах для связи с ней). Например, вам не нужно использовать среду выполнения на основе DLL, если вы создаете DLL, и вам не нужно использовать отладочную версию среды выполнения при создании отладочной версии программы, хотя, похоже, это помогает, когда одно- обходя системные вызовы.
Бонусный вопрос: как кто-то или любая компания может создать такой беспорядок?