VSCode + SSH 构建 Linux 远程 C 语言开发环境

日常进行 Linux 底层或是车载 BSP 相关的 C 语言开发时,我们通常面对的都是毫无感情的终端黑框框。虽然强迫自己用 vivim 敲代码看起来很“极客”,但在实际的大型工程中,没有代码补全、没有实时的错误提示,开发效率其实非常低。

​虽然你可以花大量时间去魔改 vim 让它接近 IDE 的体验,但这往往吃力不讨好。最直接、最高效的解决方案是:一步到位,使用 VSCode 通过 SSH 远程访问 Ubuntu,实现在 Windows 的 VSCode 中编辑和编译 Linux 中的代码

今天这篇博客,我就带大家一步步搭建这个能大幅提升幸福感的开发环境。


第一步:配置 Ubuntu 服务端

首先,我们需要在目标 Linux 机器(比如你的 Ubuntu 虚拟机或开发板)上安装并配置必要的服务。

1. 安装网络工具

为了后续能查看服务器的 IP 地址,我们需要先安装网络工具包:

sudo apt install net-tools

2. 安装并启动SSH服务

SSH 是我们远程连接的基础 。

sudo apt install openssh-server

安装完成后,启动 SSH 服务 :

sudo /etc/init.d/ssh start

3. 验证 SSH 状态并获取 IP

检查 SSH 进程是否已经在后台正常运行 :

ps -e | grep ssh

接着,查看本机的局域网 IP 地址 。记下这个地址(例如 192.168.200.136),我们一会儿在 Windows 端会用到 。

ifconfig

第二步:配置 Windows 客户端 (VSCode)

1. 版本避坑指南(必看)

​如果你使用的是 Ubuntu 18.04,VSCode 的版本必须小于或等于 1.85.2 。2024年2月发布的 VS Code 1.86 版本提高了对远程服务器 glibc 和 libstdc++ 的版本要求,强行使用新版会导致 SSH 连接失败 。如果是 Ubuntu 20.04 或 22.04,则可以安装最新版 。建议安装低版本后,在设置中禁止自动更新 。

2. 安装 Remote - SSH 插件

打开 Windows 端的 VSCode,进入左侧的插件市场,搜索 ssh,找到由 Microsoft 官方提供的 Remote - SSH 插件并安装 。

在这里插入图片描述

3. 配置 SSH 连接

安装完成后,点击左侧工具栏出现的图标
在这里插入图片描述
点击SSH栏+号,配置上方连接:ssh 用户名@Ubuntu服务器IP地址 -A
在这里插入图片描述
回车后输入用户名即密码就可以连接成功了

4. 连接并安装 C/C++ 插件

​ 保存配置后,点击连接。安装完成后,我们就可以使用 VSCode 进行代码编写和编译了 。同时,为了方便阅读和代码补全,强烈建议在远程端安装 Microsoft 的 C/C++ 插件(C/C++ Extension Pack)。

第三步:常见连接失败排查

在实际配置中,网络或版本问题可能会导致连接失败。遇到问题时,可以参考以下排查思路:

  • 报错 GLIBC >= v2.28.0 not found:这就是前文提到的版本更新导致的不兼容 。解决方法是卸载当前 VSCode,安装 1.85.2 历史版本,并设置禁止自动更新 。
  • 提示“过程试图写入的管道不存在”或突然连接不上
    • 排查 Windows IP 和 Ubuntu IP 是否在同一网段,在命令行窗口互 ping 对方 。如果 ping 不通,修改下虚拟机网络连接方式重试 。
    • Ubuntu 中查看 SSH 是否运行:ps -e | grep ssh
    • 如果之前能连突然不能连了,可能是密钥发生变化。删除电脑 C:\Users\你的用户名\.ssh\ 下的 known_hosts 文件,重新连接即可 。

第四步:VSCode + SSH 实战

场景一:多文件工程与快捷编译

在实际工程中,我们不可能把所有代码都塞进一个 .c 文件里 。假设我们正在开发一个车载相机的初始化模块,我们需要将代码拆分为头文件和源文件。

在 VSCode 中,你可以非常直观地在左侧资源管理器中右键新建文件:

1. camera_hal.h (头文件)

#ifndef CAMERA_HAL_H
#define CAMERA_HAL_H

void init_vehicle_camera(void);

#endif

2. camera_hal.c(低层实现)

#include <stdio.h>
#include "camera_hal.h"

void init_vehicle_camera(void) {
    // 模拟相机硬件的初始化握手
    printf("[HAL] Vehicle camera sensor initialized successfully.\n");
}

3. main.c(主程序)

#include <stdio.h>
#include "camera_hal.h"

int main() {
    printf("Starting BSP test program...\n");
    init_vehicle_camera();
    return 0;
}

如何编译运行?

在 VSCode 中,直接按下快捷键 Ctrl + ~ 调出集成终端(Integrated Terminal)。你不需要借助第三方 SSH 客户端,直接在下面敲入 GCC 编译指令即可 :

gcc main.c camera_hal.c -o camera_test
./camera_test

在这里插入图片描述

你会发现,编码、编译、运行,所有的操作都在一个窗口内闭环完成了,效率极高。

场景二:“一切皆文件” —— 系统 I/O 编程实战

​在 Linux 底层开发中,“一切皆文件” 是最核心的思想 。无论是硬件设备、进程状态,还是配置文件,我们都可以通过统一的文件 I/O 接口 (open, read, write, close) 来操作 。

​相比 C 语言标准库的 fopen,在 Linux 系统编程中我们更常使用底层系统调用 。以下是一个模拟写入设备配置信息的例子:

#include <stdio.h>
#include <fcntl.h>    // 包含 open 等系统调用宏
#include <unistd.h>   // 包含 write, close
#include <string.h>

int main() {
    int fd;
    const char *config_data = "resolution=1920x1080;fps=60\n";
    
    // 使用 open 打开或创建文件,设置可读写,不存在则创建,权限为 0644
    fd = open("camera_config.txt", O_RDWR | O_CREAT | O_TRUNC, 0644);
    if (fd == -1) {
        perror("Failed to open config file");
        return -1;
    }

    // 将数据写入文件
    ssize_t bytes_written = write(fd, config_data, strlen(config_data));
    if (bytes_written == -1) {
        perror("Failed to write to config");
        close(fd);
        return -1;
    }

    printf("Successfully wrote %zd bytes to config file.\n", bytes_written);

    // 关闭文件描述符
    close(fd);
    return 0;
}

在这里插入图片描述

​得益于 VSCode 的 C/C++ 插件,当你输入 open( 时,它会自动弹出各个宏定义(如 O_RDWR, O_CREAT)的提示,再也不用去翻厚厚的 API 手册了。

场景三:AI 辅助编程 —— 接入 Copilot 辅助写代码

​在纯命令行环境或者在嵌入式软件领域很火的Source Insight 4中,我们往往只能死磕代码。但切换到 VSCode 后,最迷人的优势之一就是可以无缝接入各种强大的 AI 插件(如 GitHub Copilot、Codeium 或通义灵码等)。在 Linux C 语言开发中,有大量重复性的结构体定义或模板代码,现在完全可以交给 AI 来完成。

在这里插入图片描述

总结

​通过上面三个简单的例子,我们可以看到:在 VSCode 远程环境中,从多文件管理、到底层 API 的智能补全,再到集成 AI 助手自动生成代码,整个开发体验得到了质的飞跃。

Linux C 语言开发中,有大量重复性的结构体定义或模板代码,现在完全可以交给 AI 来完成。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐