नमस्ते

Windows 超迷你单文件 C 及 C++ 环境配置指南

互联网上使用 Visual Studio Code 开发单文件 C/C++ 大多数都是采用微软提供的 C/C++ 拓展和 mingw 工具链,微软也写了一篇非常详尽的教程来指导配置。不过,微软提供的 C/C++ 拓展在很多方面并不好用,比如转到定义、快速修复或者代码高亮之类能够在编程的时候防止分心提高效率的功能。我对此的解决方案是使用 LLVM 提供的 clangd 来完成代码补全和代码高亮等现代集成开发环境会提供的功能。同时,我个人偏好使用 Clang 作为编译器前端,这几乎成了配置环境中最困难的一部分。

LLVM 在 Windows 平台提供的 Clang 并不像在其他平台那样开箱即用——它是为了与 MSVC 一同使用而提供的。因此,该构建并不包含 LLVM 的头文件,同时也会尝试寻找 MSVC 的头文件。这给在 Windows 平台使用 Clang 带来了一定的困难。最简单的解决方案就是装一个 MSVC,也就是装一个 Visual Studio 并且在安装时勾选几个包含 C/C++ 开发的选项。但是这对于一个迷你的开发环境而言有点过于困难了。
除此之外,另一个方法就是在电脑上同时安装 mingw 工具链和 LLVM 工具链,然后在编译时向 Clang 传递特殊的参数来将程序生成到三元组中包含 gnu 的平台。这方面的教程互联网上也已经有不少了。
而我们在这里尝试使用第三种方法来解决这个问题。llvm-mingw 项目为我们提供了一个“基于 LLVM/Clang/LLD 的 mingw 工具链”,而我们利用这个项目来完成我们的环境配置。

安装工具链

在配置我们的开发环境之前,你的电脑上应该安装了 Visual Studio Code。同时,你也应该具备一定水平的计算机和互联网使用常识及动手能力。
接下来,你可以在 llvm-mingw 的项目主页中找到 Releases 部分,然后下载最新(Latest)的 release。总得来说,这就是个挑选一个合适的压缩包的过程。如果你使用 Windows 10 及更新的计算机,下载包含 -ucrt-x86_64.zip 的压缩包通常是不错的选择。项目的主页也包含关于如何选择正确的文件的参考。
下载完成后,找一个你平时放工具的地方将其解压,你会得到一个与压缩包同名的文件夹,下文我们将以 llvm-mingw-20220906-ucrt-x86_64 为例。通常而言,这个放工具的地方不推荐是桌面,也不推荐是一个包含中文路径的文件夹,比如 C:\工具 ,这能帮助你规避一些很诡异的问题。在这里,我们将假设你把它放在 C:\Tools 中。到这里,你的文件应该看起来像这样:C:\Tools\llvm-mingw-20220906-ucrt-x86_64
然后我们需要修改环境变量,让我们的系统能够找到我们下载的可执行文件。具体而言,我们需要将 C:\Tools\llvm-mingw-20220906-ucrt-x86_64\bin 这个目录添加到 PATH 这个环境变量中。在互联网上找到很多关于如何修改你的系统环境变量的教程。Windows 10 及更新的系统中在屏幕下方的搜索框中搜索“环境变量”应该能找到相关选项,你可以选择是编辑系统环境变量还是用户环境变量。在打开的菜单中找到环境变量和 PATH 并点击编辑,然后新增一行并键入上文提到的这个目录。在编辑完环境变量后,重启终端1来使之生效。
最后我们来看看我们的安装是否生效。选一个你喜欢的方式打开 Powershell,比如在 Visual Studio Code 中按下 Ctrl + 反引号2组合键,然后输入 clang ,如果你的终端回显类似这样,说明我们已经完成安装:

clang: error: no input files

准备工作目录并编写源文件

找一个你平时写代码的地方,创建一个新文件夹,要求跟上面的放工具的文件夹是一致的。在这里,我们以 C:\Codes\c 举例。用 Visual Studio Code 打开这个文件夹。接着,找到拓展市场,搜索"clangd",在搜索结果中找到由 LLVM 提供的 Clangd 拓展,安装并重载工作区。在那之后找到 Visual Studio Code 的设置,从左边的目录里找到拓展 - Clangd ,翻到 Clangd: Path 条目,将它的值改为我们下载的工具链中的 bin 文件夹下的 clangd.exe ,在我们的示例里是 C:\Tools\llvm-mingw-20220906-ucrt-x86_64\bin\clangd.exe 。同时你也应该禁用更新检查 Clangd: Check Updates 条目。这会帮助你防止诸如找不到标准库之类的问题。
然后我们可以创建一个简单的源文件 example.c
这个时候,你的 Visual Studio Code 应该会根据你打开了 C 语言源文件提示你下载推荐的 C/C++ 拓展。我们的开发环境不强制需要这个拓展,所以你大可以忽略。请注意 C/C++ 拓展的部分功能与 Clangd 拓展冲突,后者会在两个拓展共存时弹出提示要求禁用前者与其冲突的功能,按照提示操作就好。
如果我们之前的配置没错的话,在打开我们上面创建的那个源文件后,左下角会出现类似 clang: idle 的字样,这说明我们成功激活了拓展。尝试写一个简单的示例程序:

// C:\Codes\c\example.c

#include <stdio.h>

int main(void) {
    int answer = 42;
    printf("The Answer to the Ultimate Question of Life, the Universe, and Everything is %d\n", answer);
    return 0;
}

在编写的过程中,你应该能注意到我们的代码补全等功能成功生效。现在,你应该能使用 Clangd 来辅助你编写源文件了。当然,你也可以尝试写一个错误的代码,看看快速修复功能是否生效,比如把其中一个 answer 改成 answe

生成可执行文件

我知道,大家觉得折腾的另一个点是生成并运行可执行文件。说到这里我们得先认清一个问题,Visual Studio Code 终究只是个代码编辑器而不是集成开发环境,不包括一个编译器和生成工具是正常的。我们可以通过其他更常见的方式来获得我们需要的可执行文件,也可以使用插件来获得这一功能。
微软提供的环境配置指南便是通过微软提供的 C/C++ 拓展来提供的这一功能。但很可惜,如果我们安装并启用该拓展,Clangd 会提示我们它与该拓展的部分功能冲突,按照提示禁用该功能后,我们会发现微软指南中提及的播放按钮消失了。
当然,没有播放按钮也一样能将生成可执行文件的功能集成到 Visual Studio Code 中,只要我们正确编写 Task 和 Launch 的相关配置,我们一样能够实现类似一键编译并执行的效果。同样地,你能在互联网上找到很多类似的教程。
不过回到我们的问题上来,由于我们用的是 llvm-mingw ,所以在我们的开发环境中配置 Task 和 Launch 的方式与大部分使用 mingw 工具链的教程中描述的应该都不相同,甚至是否能够成功都是另一码事。在这里,我提供一种更加通用但是有一点点上手难度的方式来生成可执行文件:在终端中直接调用 Clang 或 Clang++ 。
按下同样的组合键在 Visual Studio Code 中调出终端,我并不尝试在本文中详细地告诉你如何使用你的终端,互联网上有很多相关的教程,比如这篇。但简要地说,你会得到类似这样的显示:

user@machine C:\Codes\c >

这其中 @ 符号前的是你当前登陆操作系统时使用的用户名,该符号后的是你的计算机名。紧随着并用一个空格分隔的是当前终端的工作目录,换句话说,也就是终端“所在”的地方。随后的一个 > 提示你可以在之后输入命令。这些符号可能会根据你的终端模拟器或者 Shell 程序而有轻微变化3
如果你的源文件并不存放在你的工作目录下,你可能需要使用 cd 命令来更换工作目录或者在提及源文件名字时使用更详细的路径。
> 后输入 clang example.c 来编译你的源文件来生成可执行文件。如果你编写的是 C++,你需要将 clang 更换为 clang++ 。一般情况下,这会在你的终端当前工作目录下生成一个名为 a.exe 的文件,这就是我们要的可执行文件。接下来,输入 .\a.exe 来运行这个可执行文件,我们的例子中,我们可以看到终端显示出了我们想要的结果:

user@machine C:\Codes\c > clang example.c
user@machine C:\Codes\c > .\a.exe
The Answer to the Ultimate Question of Life, the Universe, and Everything is 42
user@machine C:\Codes\c >

由于我们没有指定文件名,生成的可执行文件是默认文件名。我们可以通过向 Clang 传递参数的方式来指定文件名。具体方式是在我们的命令后面加上 -o <文件名> ,在我们的例子中是这样的:

user@machine C:\Codes\c > clang example.c -o example.exe
user@machine C:\Codes\c > .\example.exe
The Answer to the Ultimate Question of Life, the Universe, and Everything is 42
user@machine C:\Codes\c >

至此,我们已经走完了从配置开发环境到运行可执行文件的全过程。值得注意的是,在这里我们并未提及符号调试器如 gdb 或 lldb ,如果你需要使用符号调试器,你需要继续向 Clang 追加更多的选项。至于如何实现类似“一键运行”的方法,也许之后我愿意折腾的话会再写一篇文章来补完。同时,由于一些现实中的困难4,本文中描述的某些步骤可能难以操作。


  1. 严格地说,你应该重启终端模拟器,比如 Powershell ISE 或者直接重启 Visual Studio Code 。
  2. 也称重音号、反撇号,通常在键盘 esc 键的下方,1 键的左方。
  3. 比如 > 可能会被显示为 %$
  4. 这可能包括良好的网络和心态。
Windows 超迷你单文件 C 及 C++ 环境配置指南

https://blog.rasp505.top/index.php/archives/8/

作者

Rasp

发布时间

2023-01-09

添加新评论