VS2017設置默認關閉Spectre緩解(以及解決CMake因此找不到編譯器的問題)

簡介

Spectre緩解按百度的說法就是 一種硬件漏洞的軟件規避方法。按微軟的說法是默認關閉的(MSVC編譯器選項/Qspectre)。簡介完。

但是

據說安裝了WDK之後會有個bug導致Spectre緩解被默認打開了,如果沒有安裝帶Spectre緩解的庫,編譯就會失敗,如下圖:

解決方案一

索性把安裝帶Spectre緩解的庫,反正是緩解漏洞安全隱患的,裝上實現Spectre緩解也不是壞事。直接在Visual studio Installer,點【修改】、【單個組件】裏面就有帶Spectre緩解的庫:

要不要安裝Arm的版本看自己需要,應該是給安卓、IOS、嵌入式開發開用得上,PC一般不會是ARM的。

解決方案二

艱難找到一個論壇,裏面有人說是裝了WDK,裏面有的prop文件打開了Spectre緩解選項,導致VS默認啓用了Spectre緩解。

在F:\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\VCTargets\Platforms\{ARM|AM64|Win32|x64}\ImportBefore\Default\Microsoft.Cpp.WDK.props

中間的目錄根據不同平臺有4個子目錄,我只改了Win32和x64的,ARM的就沒管他了,各位看着辦。Notepad++打開Microsoft.Cpp.WDK.props文件,內容如下:

<!--
***********************************************************************************************
Copyright (C) Microsoft Corporation. All rights reserved.
***********************************************************************************************
-->

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <_NT_TARGET_VERSION_WIN10_RS5>0xA000006</_NT_TARGET_VERSION_WIN10_RS5>
    <_NT_TARGET_VERSION_WIN10_RS4>0xA000005</_NT_TARGET_VERSION_WIN10_RS4>
    <_NT_TARGET_VERSION_WIN10_RS3>0xA000004</_NT_TARGET_VERSION_WIN10_RS3>
    <_NT_TARGET_VERSION_WIN10_RS2>0xA000003</_NT_TARGET_VERSION_WIN10_RS2>
    <_NT_TARGET_VERSION_WIN10_RS1>0xA000002</_NT_TARGET_VERSION_WIN10_RS1>
    <_NT_TARGET_VERSION_WIN10_TH2>0xA000001</_NT_TARGET_VERSION_WIN10_TH2>
    <_NT_TARGET_VERSION_WIN10>0x0A00</_NT_TARGET_VERSION_WIN10>
    <_NT_TARGET_VERSION_WINV63>0x0603</_NT_TARGET_VERSION_WINV63>
    <_NT_TARGET_VERSION_WIN8>0x0602</_NT_TARGET_VERSION_WIN8>
    <_NT_TARGET_VERSION_WIN7>0x0601</_NT_TARGET_VERSION_WIN7>
    <_NT_TARGET_VERSION_VISTA>0x0600</_NT_TARGET_VERSION_VISTA>
    <_NT_TARGET_VERSION_LONGHORN>0x0600</_NT_TARGET_VERSION_LONGHORN>
    <_NT_TARGET_VERSION_NT4>0x0400</_NT_TARGET_VERSION_NT4>
  </PropertyGroup>

  <!-- 下面這段像這裏這樣註釋掉 -->
  <!-- <PropertyGroup>
    <SpectreMitigation Condition="'$(SpectreMitigation)' == ''">Spectre</SpectreMitigation>
  </PropertyGroup> -->

</Project>

從最接近的PropertyGroup開始把SpectreMitigation那一塊都註釋掉,重啓VS,新建的項目就是默認禁用Spectre緩解的了。舊的項目如果屬性頁面設置了啓用會覆蓋這裏的設置,可能還是要手動改一下。

CMake

The CXX compiler identification is unknown
The C compiler identification is unknown
CMake Error at CMakeLists.txt:6 (project):
  No CMAKE_CXX_COMPILER could be found.



CMake Error at CMakeLists.txt:6 (project):
  No CMAKE_C_COMPILER could be found.



Configuring incomplete, errors occurred!
See also "H:/uchardet-0.0.7/build/CMakeFiles/CMakeOutput.log".
See also "H:/uchardet-0.0.7/build/CMakeFiles/CMakeError.log".

行號不一定是第6行,反正就是識別不了編譯器,CMAKE_CXX_COMPILER和CMAKE_C_COMPILER沒找到,我還當真的了。直到按提示看了看CMakeError.log看到裏面說的已啓用 Spectre 緩解纔想起來這個啓用了會編譯不過,明白過來了不是CMake真的沒有識別到MSVC,而是CMake用來測試編譯器的示例代碼編譯不過導致CMake不認VS2017的編譯器。按上面的方法處理之後就能識別了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章