Linux下VS Code安装与C编程环境配置

4,373 阅读9分钟

本文主要参考自VS Code官方文档,对其进行一些了简化和补充,如果想获得更多详细内容,请阅读官方文档code.visualstudio.com/docs/cpp/co…

Linux与C语言紧密相关,在Linux下写C代码更是一种享受。工欲善其事,必先利其器,舒适的开发环境非常重要。Linux下有编译器gcc和调试器gdb,还有编辑器vim。但vim的使用颇有难度,我们选择更加用户友好的VS Code进行编程,并使用扩展搭建一个完整的编程环境。

VS Code安装

Red Hat系与Debian系

前往VS Code官网下载软件包:code.visualstudio.com

如果你的Linux发行版属于Rea Hat系,如Fedora,CentOS,RHEL,下载 .rpm文件。
如果你的Linux发行版属于Debian系,如Debian,Ubuntu,Mint,ElementaryOS,下载 .deb文件。

下载完成后,打开终端并进入软件包所在目录,进行安装。

对于Red Hat系,使用dnf命令:

sudo dnf install ./软件包

对于Debian系,使用apt命令:

sudo apt install ./软件包

Arch Linux系

本节适用于Arch Linux以及基于Arch Linux的发行版,如Manjaro。

VS Code官网并未提供用于Arch Linux的pkg包,但Arch Linux社区拥有强大的AUR(ArchLinux User-community Repository),从这里可以找到构建VS Code包的方法。

虽然Arch Linux软件仓库里有VS Code的开源版本'code',但图标太丑,而且无法使用微软的扩展商店,我还是选择了官方的二进制版本。

直接克隆AUR仓库并构建安装:

git clone https://aur.archlinux.org/visual-studio-code-bin.git
cd visual-studio-code-bin
makepkg -si

如果你没有安装git,或者不喜欢这种方式,也可以下载快照再手动构建安装。

进入AUR的软件包页面aur.archlinux.org/packages/vi…,在右上角的小窗内点击'Download snapshot(下载快照)'。

下载后的文件是一个压缩包,包含一个文件夹,将其解压,如图所示:

进入解压出来的文件夹并打开终端,输入以下命令开始构建和安装软件包。

makepkg -si

此命令会依据文件夹中'PKGBUILD'文件的内容下载所需资源并构建为Arch Linux的软件包,使用包管理器安装依赖,并在构建完成后安装软件包。

如果你够仔细,会发现在构建后文件夹中多出一个以'pkg.tar.zst'为后缀的文件,这就是Arch Linux的软件包,将它保存起来,就可以在没有网络的情况下用pacman安装VS Code了。

其他发行版

在VS Code官网选择'Other platforms',下载以'tat.gz'为后缀的文件,它是一个压缩包,包含一个文件夹。解压后进入文件夹,运行名为'code'的程序即可启动VS Code。

C编程环境配置

安装编译与调试软件

可选的编译、调试软件集合有gcc-gdb与clang-lldb,一般Linux下使用gcc和gdb,macOS下使用clang和lldb。

以下各组命令分别表示在Rad Hat系,Debian系,和Arch Linux系发行版安装gccgdb的命令。

sudo dnf install gcc gdb
sudo apt install gcc gdb
sudo pacman -S gcc gdb

安装VS Code扩展

在扩展里搜索'c',安装第一个Microsoft的'C/C++‘。

VS Code的C扩展并没有VS那样好用,代码提示与补全、自动缩进等都不尽人意,所以评分偏低。而且微软的东西对C语言的支持自然低C++一等。

如果你愿意的话,还可以安装'Chinese'中文扩展。

配置编程环境

配置文件介绍

VS Code以文件夹作为工作空间,所以首先应该创建用于存放项目的文件夹,然后用VS Code打开此文件夹。

项目的配置文件存放在'.vscode'文件夹内,配置文件都是json格式,主要配置文件有以下几个:

  • tasks.json:构建可执行文件,即编译
  • launch.json:启动调试程序
  • c_cpp_properties.json:针对当前工作空间的'C/C++'扩展设置,几乎所有设置都已经迁移到settings.json中了,这个文件可以不要
  • settings.json:针对当前工作空间的VS Code设置

以上配置文件并非都是必须的,可按照需要创建。并且,当我们需要特定功能时,VS Code会自动创建相应配置文件,所以你无需手动创建'.vscode'文件夹与配置文件,在这一步将整个工作空间留空就好。

配置编译环境

首先在当前工作空间下新建一个源文件,如'main.c',再随便写些什么,比如:

#include <stdio.h>

int main(void) {
    printf("hello, world\n");
    return 0;
}

然后在顶部菜单栏依次选择 Terminal > Configure Default Build Task,并在弹出框里选择 C/C++: gcc build active file

此时VS Code便创建了‘.vscode'文件夹,并在其下创建了'tasks.json'配置文件。

打开'tasks.json'文件,内容大致如下:

{
	"version": "2.0.0",
	"tasks": [
		{
			"type": "shell",
			"label": "C/C++: gcc build active file",
			"command": "/usr/bin/gcc",
			"args": [
				"-g",
				"${file}",
				"-o",
				"${fileDirname}/${fileBasenameNoExtension}"
			],
			"options": {
				"cwd": "${workspaceFolder}"
			},
			"problemMatcher": [
				"$gcc"
			],
			"group": {
				"kind": "build",
				"isDefault": true
			}
		}
	]
}
  • version:配置文件格式的版本号,多年不变,无需关心
  • type:可选'process'或'shell',决定构建任务作为单独进程还是一条shell命令启动。如果为'shell',则可以使用通配符等shell扩展
  • label:构建任务的名字,也是任务标识
  • command:构建任务使用的命令,即调用编译器的命令,如'gcc'
  • args:传递给command的参数,即gcc的选项
    • -g:包含调试信息,用于gdb调试
    • ${file}:需要编译的文件,此变量表示当前文件
    • -o:指定可执行文件的路径和名字,即下一个参数
    • ${fileDirname}/${fileBasenameNoExtension}:这两个变量表示当前文件所在目录以及当前文件去掉扩展名后的名字
  • options:运行时选项
    • cwd:构建命令执行时的工作目录,和相对位置的查找与文件生成有关
  • problemMatcher:把编译产生的错误放到'PROBLEMS'窗口,容易跟扩展自带的语法检查产生重复内容。如不需要可以删掉这条配置
  • group:任务组设置
    • kind:任务类型,也是任务组的标识,如果是build,那么该任务会出现在 Terminal > Run Build Task... 的列表中
    • isDefault:是否作为当前任务组的默认配置

默认生成的配置文件已经可以进行编译了,我们只需要根据个人喜好修改某些参数的值,达到想要的效果。

配置调试环境

重新打开之前创建的源文件,然后在顶部菜单栏依次选择 Run > Add Configuration,并在弹出框里依次选择 C++ (GDB/LLDB) > gcc - Build and debug active file

此时VS Code就在'.vscode'文件夹下创建了'launch.json'配置文件。

同时也启动并完成了调试过程,调试信息显示在'DEBUG CONSOlE',如果不使用gdb手动调试,'DEBUG CONSOlE'的内容无需关心。

程序输出显示在'TERMINAL',这是VS Code新建的shell,程序结束后,可以像其他shell一样执行输入的命令。

在终端右侧可以切换shell,比如切换到构建任务创建的shell。

这个shell不能用来输入命令,但可以被构建任务反复使用。我们需要对这个shell多加关注,因为gcc在编译过程中的输出都会显示在这里,包括源文件的警告和错误,这些输出往往比'PROBLEMS'窗口中VS Code的'C/C++'扩展的输出更加详细和准确。

'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": "gcc - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",
            "args": [],
            "stopAtEntry": false,
            "cwd": "${workspaceFolder}",
            "environment": [],
            "externalConsole": false,
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: gcc build active file",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}
  • version:配置文件格式的版本号,无需关心
  • name:调试任务的名称,如果有多个调试任务,可以用于标识
  • type:调试器类型,只能填cppdbg
  • request:可选launchattach,选择由调试器启动被调试程序,还是调试器附加到已经启动的进程,我们选launch
  • program:被调试程序,与'tasks.json'中输出的程序对应
  • args:传递给被调试程序的参数
  • stopAtEntry:是否在入口处停止,相当于在'main'函数第一行加了个断点,一般选false
  • cwd:被调试程序的工作目录,与相对位置文件的读写有关
  • environment:传递给被调试程序的环境变量
  • externalConsole:是否使用外部控制台,如果为true,则弹出一个新窗口运行被调试程序,并在程序结束后立刻关闭窗口。否则使用VS Code的内置终端。
  • MIMode:调试器,可选gdblldb
  • setupCommands:gdb的设置命令,无需改动,无需关心
  • preLaunchTask:在调试前预先进行的任务,通过名字标识,这里填在'tasks.json'中配置好的构建任务
  • miDebuggerPath:调试器的路径,如果没有设置,则在环境变量里寻找MIMode设置的程序

开始调试

VS Code的调试方式与VS类似,可以在行数左侧添加断点,也可以右击断点区域添加条件断点。然后按F5开始调试。

结构化的调试信息都会显示在左侧的调试窗口。

管理项目

'.vscode'里的配置文件对当前工作目录下的所有文件都有效,而且我们在'tasks.json'和'launch.json'里使用变量来确定当前处理的文件,而不是指定文件名,所以所有的源文件都可以使用同样的方法构建与调试。

包含多个单文件的工作目录大致如下图所示,如果觉得生成的可执行文件碍眼,还可以修改配置文件,把它们都放在一个输出目录内。

这种单个源文件编译调试的方法很适合平时练习或者做题。

然而对于软件工程来说,哪怕再小的项目,把所有代码都写到一个文件里也是不可接受的。我们需要一个构建系统,当然这是一个复杂的内容,有空再开坑。

一点小提示

  • 本篇文章仅介绍Linux下的环境配置,Windows用户请自行探索
  • 本篇文章仅介绍C编程环境的配置,对于C++请自行探索
  • glibc把标准C库分割成好几部分,gcc默认只链接'libc',而数学库'libm'、线程库'libpthread'等都不包含在内。如果要使用数学库,除了需要在源文件里#include <math.h>,还需要在编译选项里加入'-lm'。glibc从2.34版本开始把线程库合并到'libc',但数学库依旧需要额外链接
  • 如果了解一些gcc参数,可以在'task'的shell里得到很多有用的信息