Что обеспечивает библиотеки времени выполнения C / C ++? - PullRequest
1 голос
/ 29 апреля 2020

У меня есть следующие 2 вопроса относительно Windows SDK и наборов инструментов платформы и библиотеки времени выполнения C / C ++.

  • a) Какова связь Windows SDK с C / Среда выполнения C ++ и инструментарий платформы? Правильно ли говорить, что ОБА C ++ библиотеки времени выполнения и наборы инструментов платформы предоставляются Windows SDK? Поскольку мы в основном имеем дело с наборами инструментов Platform из настроек проекта Visual Studio, поэтому мы хотим понять, управляет ли Visual Studio библиотеками времени выполнения C ++ и версиями наборов инструментов платформы, устанавливая требуемую версию Windows SDK?

  • б) Еще одна вещь, которую я хотел уточнить, это то, что если правильно сказать, что одна версия набора инструментов платформы может работать с другой версией Windows SDK, ИЛИ они совершенно не связаны? например. в моей Visual Studio я вижу, что «Windows SDK версия» - Windows 10, а набор инструментов платформы - v142. Могу ли я установить 'Windows SDK version' на Windows 8.1 и сохранить набор инструментов как v142? Если да, то что это значит?

Меня это сильно смущает, и я не могу получить правильную картину с таким количеством разных объяснений от разных людей.

1 Ответ

1 голос
/ 30 апреля 2020

TL; DR: Если вы используете Visual C ++ и используете стандартные инструкции REDIST из Документов Microsoft , то эти подробности не должны иметь для вас никакого значения.

В VS 2015 и более поздних версиях «Среда выполнения C / C ++» была реорганизована на три части:

  • UCRTBASE.DLL является частью ОС и обслуживается через Windows Обновление , В пакете REDIST для Visual C ++ есть версии «нижнего уровня», но обычно вы должны думать об этом как о части «ОС». Это "C Runtime". Эти заголовки, библиотеки импорта и находятся в Windows 10 SDK. Вы также можете найти его источник там C:\Program Files (x86)\Windows Kits\10\Source\<version>\ucrt.

  • MSVCP*.DLL Это библиотека "C ++ Runtime", в основном такая, как std::vector et al. Заголовки, библиотеки импорта и тому подобное находятся в продукте Visual C ++. Вы можете найти источник к нему на GitHub за этот пост в блоге .

  • VCRUNTIME*.DLL имеет точки входа, необходимые во время выполнения для возможности языка компилятора Visual C ++.

Есть также несколько вспомогательных библиотек для спецификаций c scenar ios:

  • VCCORLIB*.DLL используется для C ++ / CX расширений (он же /ZW)

  • VCAMP140.DLL используется для C ++ AMP

  • VCOMP140.DLL используется для OpenMP

  • CONCRT*.DLL используется для реализации C ++ 11 <thread> на Windows XP (не используется в более новых версиях Windows; при необходимости загружается задержка)

См. это сообщение в блоге и это сообщение .

По существу, часть C runtime (UCRTBASE) является простым extern "C" интерфейсом, поэтому ABI четко определен и, следовательно, может использоваться с несколькими версиями Visual C ++ и даже с другими компиляторами. То, какая именно версия UCRT вы используете, следовательно, в первую очередь зависит от ОС и Windows 10 SDK, который вы используете через WindowsTargetPlatformVersion. Вы также можете локально развернуть UCRT для этого этого блога .

Среда выполнения C ++ (MSVCP * .DLL) включает в себя множество встроенных и открытых структур памяти, и исторически существовало существенное изменение между между версиями Visual C ++. Тем не менее, для VS 2015 Update 3, VS 2017 и VS 2019 команда V C сделала ставку на то, чтобы поддерживать «двоичную совместимость», что означает, что если у вас есть библиотека stati c, которая использует компоненты пространства имен C ++ std из PlatformToolset v140 / v141, он успешно свяжется с более поздней версией Visual C ++ до v142. Не ясно, будет ли это в будущем, но это верно для этого конкретного набора выпусков для Документов Microsoft .

* VCRUNTIME*.DLL должен соответствовать версии Visual C ++ компилятор, который вы используете для создания окончательной ссылки, поэтому он очень подходит для вашего PlatformToolset.

...