Кажется, что всю мою взрослую жизнь меня мучил компоновщик 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, хотя, похоже, преодолевая системные вызовы.
Бонусный вопрос: как может любой или любая компания создать такой беспорядок?