本文最后更新于2024年9月10日,已超过 60 天没有更新,如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

动机

Visual Studio可以说是我折腾之路的起点,大学的时候我曾因为不喜欢微软强制为一个编译器捆绑下载一整个IDE的做法,转到GNU生态(IDE会把所有编译细节隐藏掉,这点让我难受),然而最近我开始研究怎么使用Nsight,发现Nsight System目前无法支持WSL2,并且因为nvcc在windows端和MSVC的cl编译器绑定,貌似躲不开cl了,我还是抱着侥幸心理查了一下,发现微软终于妥协了,提供了一个不带IDE,不需要账号验证的Build Tool,虽然他仍然有4.3GB(拿相同使用场景,用gcc支持windows全栈开发的项目w64devkit只有330M的比一下,可能不严谨),等等党的胜利!

如何使用

可以参考Visual Studio Code文档中关于配置windows端C++编译器的部分,在Visual Studio的下载页面中,向下滚动可以看到"Visual Studio 2022 生成工具",点击下载。

Clip_2024-04-24_22-27-37

这将启动 Visual Studio 安装程序,显示可用的 Visual Studio 生成工具。选中“使用 C++ 进行桌面开发”,然后选择“安装”。

Cpp build tools workload

安装完成后,官方文档会建议你使用Developer Command Prompt一个特定的命令行工具来使用cl.exe,但我仍然觉得这一步是麻烦的,为什么不能和gcc一样直接用呢。

Developer Command Prompt

这种窗口只是设置了一下环境变量,效果相当于在当前命令行执行D:\Env\VSBT\2022\BuildTools\VC\Auxiliary\Build\vcvarsall.bat x64|x86_amd64|x64|x64_x86|...,vcvarsall.bat设置了msvc需要的环境变量,参数是对应的场景, 本篇使用x64。在官方文档的这里,有这么一段话。

引用自通过命令行使用 Microsoft C++ 工具集 | Microsoft Learn

MSVC 命令行工具使用 PATHTMPINCLUDELIBLIBPATH 环境变量,还使用特定于已安装工具、平台和 SDK 的其他环境变量。 即使是简单 Visual Studio 安装,也可以设置二十或更多个环境变量。 正是考虑到这种复杂性,我们强烈建议使用开发人员命令提示符快捷方式或一个自定义命令文件。 建议不要自行在 Windows环境中设置这些变量。

在这里咱们不用理会他的强烈建议,也就是说我们只要把 PATHTMPINCLUDELIBLIBPATH从Developer Command Prompt搞出来,配置成全局变量就不再需要它了。

实际上,这种带环境的窗口工具一共有5种分别对应5种场景,后两种的交叉编译的场景,选择你需要的开发环境,搬出环境变量即可,以x64为例。

Clip_2024-04-24_23-04-41

PATH中加入的(D:\Env\VSBT是我的安装路径):

D:\Env\VSBT\2022\BuildTools\VC\Tools\MSVC\14.39.33519\bin\HostX64\x64;
D:\Env\VSBT\2022\BuildTools\Common7\IDE\VC\VCPackages;
D:\Env\VSBT\2022\BuildTools\Common7\IDE\CommonExtensions\Microsoft\TestWindow;
D:\Env\VSBT\2022\BuildTools\Common7\IDE\;
D:\Env\VSBT\2022\BuildTools\Common7\Tools\;
D:\Env\VSBT\2022\BuildTools\MSBuild\Current\bin\Roslyn;
D:\Env\VSBT\2022\BuildTools\MSBuild\Current\Bin\amd64;
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64;
C:\Program Files (x86)\Windows Kits\10\bin\x64;
C:\Windows\Microsoft.NET\Framework64\v4.0.30319;

LIB:

D:\Env\VSBT\2022\BuildTools\VC\Tools\MSVC\14.39.33519\lib\x64;
C:\Program Files (x86)\Windows Kits\10\lib\10.0.22621.0\ucrt\x64;
C:\Program Files (x86)\Windows Kits\10\lib\10.0.22621.0\um\x64;

INCLUDE:

D:\Env\VSBT\2022\BuildTools\VC\Tools\MSVC\14.39.33519\include;
D:\Env\VSBT\2022\BuildTools\VC\Auxiliary\VS\include;
C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt;
C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\um;
C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\shared;
C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\winrt;
C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\cppwinrt;

LIBPATH:

D:\Env\VSBT\2022\BuildTools\VC\Tools\MSVC\14.39.33519\lib\x64;
D:\Env\VSBT\2022\BuildTools\VC\Tools\MSVC\14.39.33519\lib\x86\store\references;
C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.22621.0;
C:\Program Files (x86)\Windows Kits\10\References\10.0.22621.0;
C:\Windows\Microsoft.NET\Framework64\v4.0.30319;

TMP:

C:\Users\zhou.jianqi\AppData\Local\Temp;

最低配置

以下是我尝试的最低配置,可以支持nvcc和大多数的编译场景:

PATH

D:\Env\VSBT\2022\BuildTools\VC\Tools\MSVC\14.39.33519\bin\HostX64\x64
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64

LIB

D:\Env\VSBT\2022\BuildTools\VC\Tools\MSVC\14.39.33519\lib\x64;
C:\Program Files (x86)\Windows Kits\10\lib\10.0.22621.0\ucrt\x64;
C:\Program Files (x86)\Windows Kits\10\lib\10.0.22621.0\um\x64;

INCLUDE

D:\Env\VSBT\2022\BuildTools\VC\Tools\MSVC\14.39.33519\include;
C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\ucrt;
C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\um;
C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\shared;
C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\winrt;
C:\Program Files (x86)\Windows Kits\10\include\10.0.22621.0\cppwinrt;

24-09-10: Path补充 C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64,rc.exe的路径

测试

最基础的hello word通过。

Clip_2024-04-24_23-29-51

再来个稍微复杂点的,编译一个寻路算法可视化程序,文件地址点这里👈。

使用指令cl /EHsc /utf-8 /std:c++17 ./a_star.cpp & a_star.exe来执行编译。

GIF 2024-4-25 0-06-35


有帮助的话请打个赏吧!