cmake調用VS2019的v140(VS2015)的工具鏈編譯通過

最近的工作基本上在Linux上做。

但是,也有一個小工具需要同時支持Windows/Linux,工具依賴於Qt,從官方下載的版本上有qt5.6.3/5.12.12,這兩個版本都有MSVC2015。

因此搞了一個Win7的虛擬機,VS2015實在太大了,從VS2019的社區版看到可以定製僅安裝C++工具鏈即可。

VS2019裁剪最小項
C++核心桌面功能
實時調試器
Windows 10 SDK(10.0.16299.0)
MSVC v140 - VS 2015 C++ 生成工具(v14.00)

安裝完後,使用VS 2019的IDE是可以編譯一個樣例工程,但通過cmake來調用,就會發現各種問題。

最頭痛的一個問題是:

Could not load file or assembly 'Microsoft.Build, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified

對應的中文提示往往是:

    C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140\Microsoft.Cpp.Current.targets(64,5): error MSB4062: 未能從程序集 C:\Program Files (x86)\MSBuild\Micro
soft.Cpp\v4.0\v140\Microsoft.Build.CppTasks.Common.dll 加載任務“SetEnv”。未能加載文件或程序集“Microsoft.Build.Utilities.Core, Version=14.0.0.0, Culture=neutr
al, PublicKeyToken=b03f5f7f11d50a3a”或它的某一個依賴項。系統找不到指定的文件。 請確認 <UsingTask> 聲明正確,該程序集及其所有依賴項都可用,並且該任務包含實現 Mi
crosoft.Build.Framework.ITask 的公共類。 [D:\01.SrcCode\XXX\build\CMakeFiles\3.25.1\VCTargetsPath.vcxproj]

反覆研究、搜索引擎,最終在github一個issue中找到原因,鏈接:https://github.com/deadlydog/New-NuGetPackage/issues/1

相應關鍵提示點:需要安裝Microsoft Build Tools 2015!!!

> If you install the Microsoft Build Tools 2015 [https://www.microsoft.com/en-us/download/details.aspx?id=48159] it resolved the issue for me.
> 
> I had a number of VS2015 projects with this great package, and after a rebuild of my machine and clean VS2017 Pro installed I had the issue described:
> 
> Could not load file or assembly 'Microsoft.Build, Version=14.0.0.0
> 
> Installing the VS2015 build tools fixed it for me

CMake編譯生成VS工程時,還有一些其他注意事項:

1、報MSBUILD找不到VCTargetsPath,

D:\01.SrcCode\xxxx\build\CMakeFiles\3.25.1\VCTargetsPath.vcxproj(14,2): error MSB4019: 未找到導入的項目“D:\Microsoft.Cpp.Default.props”。請確認 <Import> 聲明中的路徑正確,且磁盤上存在該文件。

 實際上是MSBUILD找不到VS2015工具集的一些配置信息,通常安裝在C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140路徑下

通過環境變量設置即可解決,如下:

set VCTargetsPath=C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\v140

2、VS2015與Windows SDK的配套問題,VS2015默認支持Windows 8.1 SDK,而現在通常是Windows 10 SDK,而且版本越來越新。

實際上Windows 10 SDK的新版本也是不再默認支持VS2015,最後支持VS2015的SDK版本爲10.0.14393.0

鏈接:https://cmake.org/cmake/help/latest/generator/Visual%20Studio%2014%202015.html

通常的解決辦法是定義環境變量:CMAKE_SYSTEM_VERSIONCMAKE_WINDOWS_KITS_10_DIR,從文檔https://cmake.org/cmake/help/v3.13/variable/CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION.html

來看CMAKE_WINDOWS_KITS_10_DIR應該定義成這樣:

set CMAKE_WINDOWS_KITS_10_DIR=C:\Program Files (x86)\Windows Kits\10

不帶Include/10.0.xxxx字樣。

CMAKE_SYSTEM_VERSION在環境變量中設置不起作用,必須在執行的命令中添加,類似如下:

c:\cmake\bin\cmake.exe -DCMAKE_SYSTEM_VERSION=10.0.14393.0 XXX

3、當然,如果提示msbuild.exe都找不到,則應該在VS 2015 X86/X64本機工具命令提示符下的環境運行,或者執行腳本設置好環境變量c:\xxxx\vsvarsall.bat amd64

 

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