簡介
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的編譯器。按上面的方法處理之後就能識別了。