Удаление зависимости от версии Windows SDK - PullRequest
2 голосов
/ 23 апреля 2019

Я пытаюсь скомпилировать MPIR (версия GMP для Windows).У меня установлена ​​Visual Studio 2017, так что она должна работать, но я получаю это сообщение об ошибке:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.Cpp.WindowsSDK.targets(46,5): error MSB8036: The Windows SDK version 8.1 was not found. Install the required version of Windows SDK or change the SDK version in the project property pages or by right-clicking the solution and selecting "Retarget solution". [C:\mpir\msvc\vs17\lib_mpir_gc\lib_mpir_gc.vcxproj]

Мне специально нужно добраться до точки, где она может быть скомпилирована на любой машине,не только этот, так что установка именно этой версии SDK на этом компьютере не решит проблему.Мне нужно что-то изменить, чтобы заставить его строить с Visual Studio 2017.

Глядя в C:\mpir\msvc\vs17\lib_mpir_gc\lib_mpir_gc.vcxproj, я нахожу строку:

<WindowsTargetPlatformVersion>10.0.17134.0</WindowsTargetPlatformVersion>

Что выглядит многообещающе, но удаление его не имеет никакого эффекта;сообщение об ошибке остается без изменений.

Что я могу изменить, чтобы устранить эту ошибку?

Подводя итог, я считаю, что это возможно:

Если вы пишете программу на C ++Скажем, в простейшем сценарии, в одном файле с именем foo.cpp, и скомпилируйте его с помощью компилятора командной строки cl foo.cpp, он автоматически скомпилирует и свяжет с любой версией SDK, используемой текущей установкой Visual Studio, для генерации foo.exe, которая(если вы не использовали какой-то очень специализированный API, доступный только в более поздних версиях Windows), будет работать на любой Windows, по крайней мере, с Vista.

И это точно такой же cl.exe, который вызывается msbuild.Так что я не прошу новый функционал.Скорее, вышеупомянутое сообщение об ошибке генерируется, потому что что-то старалось изо всех сил , чтобы сломать сценарий по умолчанию «это просто работает» и добавить блокировку к определенной версии SDK.Я спрашиваю, как снять блокировку и вернуться к сценарию по умолчанию, где он просто работает с любой версией SDK, с которой поставляется Visual Studio.

Ответы [ 2 ]

3 голосов
/ 23 апреля 2019

Как говорится в комментариях, это неизбежно.

Если вы собираете с помощью Windows 8.1 SDK, вы получаете версию, которая работает на Windows 8.1 или выше . Если вы собираете с помощью Windows 10 SDK, вы можете ограничить его функциональность до Windows 8 или выбрать сборку Windows 10 (например, 1607). Конечно, если вы выберете новый SDK для использования новых функций Windows 10, вы не сможете запустить его в Windows 8.1, в которой эта функциональность отсутствует.

Но если вы не выберете Windows SDK, то какую версию Windows вы бы собирали? Какой <windows.h> вы бы использовали?

[править] Что касается переносимых программ на C ++, они, очевидно, не включают <windows.h> и не ссылаются напрямую на API Windows. Вместо этого они зависят от реализации Microsoft стандартной библиотеки C ++ (MSVCRT)

[edit2] Я только что посчитал, что моя установка Visual Studio 2017 (15.7.5) имеет 12 различных вариантов SDK. Да, некоторые из них предназначены для ARM, но это всего лишь разновидность базовой предпосылки: выбранный вами SDK влияет на машины, на которых вы можете запустить получившееся приложение.

2 голосов
/ 23 апреля 2019

VS2019 поддерживает нацеливание проектов на последнюю установленную версию Windows SDK, выбрав соответствующий пункт.Это может или не может привести к желаемым результатам, однако, безусловно, устранит необходимость в перенаправлении проекта вручную.

enter image description here

...