花费了将近一个半小时才把 Windows 运行 VSCode 编译 C 的环境搭建起来,参照 VSCode 的官方文档操作,运行时还是“Duang”的反复报错,网上的帖子有很多,大多数作为入门贴,操作起来着实不方便,而且对一些问题的处理细节不到位,让人照着操作可能会成功,但不知其所以然。
今天把自己的血泪史和理解整理成文章,为常年奋战在 Windows 一线开发的程序员在首次搭建 VSCode 编译环境时提供一点点参考。
废话不多说,一起来看看我今天遇到的坑和解决过程。
前提
1.已经安装 VS2019 Preview 版本。重点不是 Visual Studio 的版本,而是安装时必须选择 C/C++ 运行时库。
2.下载安装 VSCode ,并更新至最新版。
官方教程
本节不详细介绍操作的具体流程,只是简单罗列关键步骤和文档结果,详细的过程和参数说明见 VSCode 的官方文档:https://code.visualstudio.com/docs/cpp/config-msvc#_the-term-clexe-is-not-recognized
准备工作
详细内容参见官方文档的操作步骤,虽然是英文,但内容图文并茂关键操作都有高亮显示和工具下载的跳转链接,非常易读,关键步骤如下:
- 安装 VSCode
- 运行 VSCode,安装 C/C++ extension for VS Code 插件。
- 安装 Microsoft Visual C++ (MSVC) 工具包。
- 检查 MSVC 工具包的是否安装成功。
创建示例工程
1.创建示例代码,安装编程惯例,第一个程序一定是 HelloWorld,本次也不例外。
新建空文件夹,使用 VSCode 设置为工程目录,使用 VSCode 创建 helloworld.cpp
文件,并加入示例代码。
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};
for (const string& word : msg)
{
cout << word << " ";
}
cout << endl;
}
- 编译 helloworld.cpp
2.1 创建 task.json 文件
task.json
负责设置编译选项,创建方式Terminal > Configure Default Build Task
选择C/C++:cl.exe build active file
,在 .vscode 目录下生成tasks.json
文件,内容如下:
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "C/C++: cl.exe 生成活动文件", // 此处的内容与系统语言有关,中文语言则显示中文
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/Fe:",
"${fileDirname}\\${fileBasenameNoExtension}.exe", // 第一个坑!
"${file}" // 第二个坑!
],
"problemMatcher": ["$msCompile"],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
2.2 创建 launch.json
文件
按照官方文档介绍,创建默认的配置文件如下:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "cl.exe - 生成和调试活动文件",
"type": "cppvsdbg",
"request": "launch",
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"console": "externalTerminal",
"preLaunchTask": "C/C++: cl.exe 生成活动文件"
}
]
}
2.3 创建 c_cpp_properties.json
文件
按照官方文档,选择 C/C++ 的 UI 配置方式创建出如下的配置文件:
{
"configurations": [
{
"name": "Win32",
"includePath": [
"${workspaceFolder}/**"
],
"defines": [
"_DEBUG",
"UNICODE",
"_UNICODE"
],
"windowsSdkVersion": "10.0.18362.0",
"compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2019/Preview/VC/Tools/MSVC/14.25.28508/bin/Hostx64/x64/cl.exe",
"cStandard": "c17",
"cppStandard": "c++17",
"intelliSenseMode": "windows-msvc-x64"
}
],
"version": 4
}
其中 "compilerPath"
的内容与当前环境已安装的编译器有关,不需要过度关心,如果在 UI 配置环节没有检测到编译器,则需要回到开篇处,先安装相关的 C/C++ 编译器。
代码编译
配置完毕,开始编译,遇到如下坑:
坑1:未初始化VS环境变量
问题现象:VSCode 在左侧导航栏选择 “Debug”
标签页,运行设置选择配置文件中所罗列的 “cl.exe - 生成和调试活动文件”,操作截图如下:
错误原因:VSCode 的终端无法正常识别 cl.exe ,在终端中输入 cl.exe 果然没有看到帮助信息的提示内容。
解决方案:
- 方案1(不推荐):将 VS 的环境变量全部加入计算机环境变量,添加内容如下:
//在Path中添加cl.exe所在文件夹路径。若未找到,直接VS的安装目录下搜索cl.exe即可
C:\Program Files\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86;
//在系统变量中新建变量INCLUDE,添加cl.exe的包含目录
C:\Program Files\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include;
C:\Program Files\Windows Kits\10\Include\10.0.17763.0\shared;
C:\Program Files\Windows Kits\10\Include\10.0.17763.0\ucrt;
C:\Program Files\Windows Kits\10\Include\10.0.17763.0\um;
C:\Program Files\Windows Kits\10\Include\10.0.17763.0\winrt;
//在系统变量中新建变量LIB,添加cl.exe的库目录
C:\Program Files\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\lib\x86;
C:\Program Files\Windows Kits\10\Lib\10.0.17763.0\um\x86;
C:\Program Files\Windows Kits\10\Lib\10.0.17763.0\ucrt\x86;
————————————————
版权声明:本文为CSDN博主「北冥有鱼wyh」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_34801642/article/details/105453161
方案2(推荐):使用 MSVC 的命令行工具启动 VSCode,此方式较方案1来说,具有更强的灵活性,对其他工程影响小。
- Windows 开始菜单搜索 “VS” 选择命令行工具,我的电脑是安装 VS2019 Preview,我选择运行 “x64 Native Tools Command Prompt for VS 2019 Preview” 工具。
- 启动后可以尝试运行 cl.exe 可以看到正常的命令行工具提示信息。
**********************************************************************
** Visual Studio 2019 Developer Command Prompt v16.5.0-pre.2.0
** Copyright (c) 2019 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x64'
C:\Program Files (x86)\Microsoft Visual Studio\2019\Preview>cl.exe
用于 x64 的 Microsoft (R) C/C++ 优化编译器 19.25.28508.3 版
版权所有(C) Microsoft Corporation。保留所有权利。
用法: cl [ 选项... ] 文件名... [ /link 链接选项... ]
- 在初始化环境变量的终端里启动 VSCode,输入
"code"
即可启动 VSCode。当然也可以运行 VSCode 的安装路径(*.exe)。
为什么执行 “x64 Native Tools Command Prompt for VS 2019 Preview” 会初始化 MSVC 的环境变量?
这个问题可以自行百度,有一定基础的程序员可以通过文件属性,查看快捷方式的启动命令,实际上这里的快捷方式是调用 MSVC 命令行工具并在启动时完成当前版本 VS 环境的初始化操作,上述流程对于使用 NMake 构建的开发者来说一定不陌生。
- 启动上一步创建成功的工作目录,在 VSCode 的中断中输入 cl.exe 即可看到提示信息。
- 运行程序
坑2:task.json 部分设置未更改
点击 VSCode 左侧的 "Debug"
按钮,选择运行,提示如下错误:
正在启动生成...
cl.exe /Zi /EHsc /nologo /Fe: C:\Users\Documents\C\HelloVSCode\.vscode\tasks.exe C:\Users\Documents\C\HelloVSCode\.vscode\tasks.json
cl: ������ warning D9024 :��ʶ���Դ�ļ����͡�C:\Users\Documents\C\HelloVSCode\.vscode\tasks.json�����ٶ�Ϊ�����ļ�
C:\Users\Documents\C\HelloVSCode\.vscode\tasks.json : fatal error LNK1107: �ļ���Ч����: ���� 0x1DC ����ȡ
生成已完成,但出现错误.
The terminal process failed to launch (exit code: -1).
Terminal will be reused by tasks, press any key to close it.
错误原因:从输出的信息来看 cl.exe 编译的文件并非期望的 “helloworld.exe” 和 “helloworld.cpp” 文件而是 task.json
文件,问题就出在这里,创建 task.json
之后需要将参数 “args” 中的参数进行修改,其中包括:
"${fileDirname}\\${fileBasenameNoExtension}.exe"
改为当前应用程序的文件名"helloworld.exe"
;"${file}"
改为"helloworld.cpp"
修改后的配置task.json
配置内容如下:
{
"version": "2.0.0",
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: cl.exe 生成活动文件",
"command": "cl.exe",
"args": [
"/Zi",
"/EHsc",
"/nologo",
"/Fe:",
"helloworld.exe",
"helloworld.cpp"
],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$msCompile"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "编译器: cl.exe"
}
]
}
提个小问题,为什么配置文件中不是设置文件的全路径?
原因是下文的配置选项中已设置工作目录 “cwd”: “${workspaceFolder}”,如果代码文件不在当前工程的根目录则需要写入相对路径。
坑3:launch.json 部分配置未更改
问题的原因同 task.json
配置,其中
"program": "${fileDirname}\\${fileBasenameNoExtension}.exe"
运行程序的名称并未修改为当前工程的名称,
参照 task.json
将 "${fileDirname}\\${fileBasenameNoExtension}.exe"
内容修改为 "helloworld.exe"
,修改配置如下:
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "cl.exe - 生成和调试活动文件",
"type": "cppvsdbg",
"request": "launch",
"program": "helloworld.exe",
"args": [],
"stopAtEntry": true,
"cwd": "${workspaceFolder}",
"environment": [],
"console": "externalTerminal",
"preLaunchTask": "C/C++: cl.exe 生成活动文件"
}
]
}
再次调试运行,代码进入熟悉的调试界面,熟悉的快捷键,仿佛回到 Visual Studio 的调试。
运行调试
开始调试程序,让 VSCode 成为日常办公的利器,本篇踩坑记录到此为止。
总结
- 遇到问题的原因,缺少 MSVC 环境变量的机制,初始配置环境找不到 cl.exe 是第一个拦路虎,知晓原因后问题迎刃而解。
- 编译报错,这一点主要是看使用者的细心程度,仔细的阅读官方文档或者查看错误提示信息,都可以找到解决问题的蛛丝马迹。留意每一个错误中的提示信息,都会是解决问题的启发点。
参考链接
- VSCode MSVC 配置官方文档:https://code.visualstudio.com/docs/cpp/config-msvc#_the-term-clexe-is-not-recognized
- VSCode 变量说明:https://code.visualstudio.com/docs/editor/variables-reference
- Visual Studio 环境变量设置:https://blog.csdn.net/qq_34801642/article/details/105453161