Trae IDE + WSL2 openEuler 构建 openGauss开发环境

Trae IDE + WSL2 openEuler 构建 openGauss开发环境

文档版本:V2.0
适用环境:Windows 10/11 + Trae IDE + WSL2 openEuler-22.03 x86_64 + openGauss-server 源码
核心目标:实现 WSL 内编译、Trae 远程 clangd 全量代码跳转、GDB 调试及一键打包


一、整体架构与核心原理

1.1 核心结论

代码跳转、编译、Git、终端、clangd 语言服务、GDB 调试全部运行在 WSL 子系统;Windows Trae 只负责显示 UI 界面,不处理任何代码解析/编译逻辑;源码必须放在 WSL Linux 家目录(/home/wangchao/xxx),禁止放 Windows C/D 盘。

1.2 分层架构拆解(谁在干活)

Windows 端:Trae 客户端(纯界面层)

  • 只负责:窗口、文字渲染、鼠标点击、快捷键、文件预览展示

  • 不运行 clangd、cmake、gcc、git、调试器

  • 所有代码读写、语法分析、跳转请求都通过进程通道转发给 WSL 内的服务端处理

WSL openEuler 端:Trae 服务端(真正的工作空间载体)

连接 WSL 后,Trae 自动在子系统内安装配套服务,所有开发任务在此执行:

  • 代码文件物理存储(源码、tmp_buildbinarylibscompile_commands.json 等)

  • clangd LSP 语言服务:读取 WSL 内的 compile_commands.json、头文件、源码做索引和跳转

  • 编译脚本 build.sh:调用 WSL 里的 cmake/gcc/flex/bison

  • Git 版本控制:使用 WSL 内置 git,识别 Linux 文件权限和 LF 换行

  • GDB 调试:调试器运行在 WSL,附加 WSL 编译出的 gaussdb 进程

  • 工作空间配置(.clangd、IDE 设置、编译缓存)全部存在 WSL 内部

1.3 文件路径两种模式对比(为什么禁止 Windows 盘符)

模式 特点 结论
WSL 家目录 /home/wangchao/openGauss-server 原生 Linux inotify 监听,读写快;路径解析无错乱;软链接正常;权限、头文件、三方库完全匹配 :white_check_mark: 推荐规范
Windows 盘 /mnt/c/xxx 通过 DrvFs 挂载,读写慢几十倍;Linux 权限/符号链接支持不全;clangd 路径混乱;编译异常 :cross_mark: 不推荐

1.4 WSL2 工作空间数据物理存储位置(openEuler WSL)

核心存储原理

WSL2 是轻量 Hyper-V 虚拟机,整个 Linux 系统、源码、binarylibs、编译产物、配置全部存放在单个虚拟磁盘文件 ext4.vhdx,Windows 资源管理器看不到 Linux 内部文件夹。

  • 你的离线导入方式:

    wsl --import openEuler-22.03 D:\WSL\openEuler-2203  tar包路径
    

    虚拟磁盘文件位于 D:\WSL\openEuler-2203\ext4.vhdx,所有 WSL 内数据(/home/wangchao/...)都存在这里面。

  • Windows 访问 WSL 文件的两种方式:

    • 文件管理器地址栏输入 \\wsl$\openEuler-22.03 可浏览(只读建议)

    • WSL 内 /mnt/c//mnt/d/ 访问 Windows 磁盘(跨盘共享)

区分两类数据(风险不同)

  • WSL 内部数据(危险)/home/wangchao/、系统配置、编译产物、源码仓库 → 全在虚拟磁盘,注销 WSL 会彻底清空

  • Windows 本地磁盘数据(安全)/mnt/d/code/、手动拷贝的备份、导出的 tar 包 → 与虚拟磁盘隔离

1.5 数据安全与备份规范

误操作会不会丢失数据?

  • 仅重启 WSL / wsl --shutdown / 关机 → 不会丢失

  • WSL 内 rm -rf ~/openGauss-server代码直接丢失,不可逆

  • wsl --unregister openEuler-22.03全部数据永久清空(最高风险)

  • 手动删除 ext4.vhdx → 等同于格式化,数据全丢

  • 重置/卸载 WSL 发行版 → 视选项而定,可能清空

强制安全规范

  1. 核心源码优先推 Git 仓库(最可靠备份)

  2. 定期导出 WSL 完整快照

    wsl --shutdown
    wsl --export openEuler-22.03 D:\WSL_Backup\oe2203_full_backup.tar
    

    恢复:

    wsl --unregister openEuler-22.03
    wsl --import openEuler-22.03 D:\WSL\openEuler-2203 D:\WSL_Backup\oe2203_full_backup.tar --version 2
    
  3. 源码单独拷贝到 Windows 磁盘(定期):

    cp -r ~/openGauss-server /mnt/d/code_backup/
    cp -r ~/binarylibs /mnt/d/code_backup/
    
  4. 高危操作禁止:随意 wsl --unregister、手动删除 ext4.vhdx、WSL 内 sudo rm -rf ~/*、完全重置发行版


二、环境搭建

2.1 Windows 启用 WSL2(管理员 PowerShell)

# 启用 WSL 和虚拟机平台(若已启用可跳过)
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
# 重启电脑后执行
wsl --set-default-version 2
# 下载并安装 WSL2 内核更新包(https://aka.ms/wsl2kernel)

常用 WSL 管理命令:

wsl -l -v                 # 查看发行版列表
wsl --shutdown            # 关闭全部 WSL
wsl -d openEuler-22.03 -u root   # root 登录

2.2 openEuler WSL 离线安装与初始化

  1. 下载根文件系统(openEuler 22.03 LTS SP4 x86_64):
    https://dl-cdn.openeuler.openatom.cn/openEuler-22.03-LTS-SP4/WSL/openEuler-22.03-LTS-SP4-x86_64-wsl.tar.gz

  2. 导入 WSL

    mkdir D:\WSL\openEuler2203
    wsl --import openEuler-22.03 D:\WSL\openEuler2203  D:\路径\openEuler-22.03-LTS-SP4-x86_64-wsl.tar.gz
    
  3. 开启 systemd(支持 sshd 等服务):

    sudo tee /etc/wsl.conf <<EOF
    [boot]
    systemd=true
    EOF
    

    PowerShell 执行 wsl --shutdown 重启生效。

  4. 配置 sudo 免密

    sudo usermod -aG wheel wangchao
    sudo visudo
    # 修改 %wheel  ALL=(ALL)  NOPASSWD: ALL
    
  5. 安装 SSH 服务(可选,方便远程):

    sudo dnf install -y openssh-server
    sudo systemctl enable --now sshd
    

2.3 安装全套编译依赖

sudo dnf update -y
sudo dnf groupinstall "Development Tools" -y
sudo dnf install -y libedit-devel libxml2-devel lz4-devel numactl-devel unixODBC-devel \
    java-1.8.0-openjdk-devel make binutils libaio-devel flex bison ncurses-devel \
    glibc-devel patch readline-devel openblas-devel which python3 dkms cmake gcc gcc-c++

特别注意:cmakeflexbison 是编译必须,groupinstall 不包含需单独安装。

2.4 预编译第三方库 binarylibs 部署

mkdir -p /home/wangchao/binarylibs
wget https://opengauss.obs.cn-south-1.myhuaweicloud.com/latest/binarylibs/gcc10.3/openGauss-third_party_binarylibs_openEuler_2203_x86_64.tar.gz -P ~/download
tar -zxvf ~/download/openGauss-third_party_binarylibs_openEuler_2203_x86_64.tar.gz -C /home/wangchao/binarylibs --strip-components=1
sudo chown -R $USER:$USER /home/wangchao/binarylibs
ls /home/wangchao/binarylibs   # 校验

三、Trae IDE 配置

3.1 插件安装与冲突处理

  • 完全卸载微软官方「C/C++ (cpptools)」插件(与 clangd 冲突)

  • 必须安装三个核心插件:

    1. Open Remote - WSL(远程连接)

    2. clangd(C/C++ LSP 语言服务)

    3. CMake Tools(CMake 可视化编译调试)

3.2 关于 clangd Linux 二进制自动下载的说明

当你在 Trae 中打开 WSL 远程工作区时,clangd 插件会自动检测 WSL 内是否已有 Linux 版 clangd 可执行文件。若没有,会弹窗下载 clangd-linux-22.1.6.zip(或对应版本),并解压到 ~/.vscode-server/extensions/llvm-vs-code-ext.vscode-clangd-xxx/clangd_bin/linux/

  • 不要点击「取消」,否则无跳转无提示。

  • 该二进制是 Linux x86_64 ELF 程序,与 Windows 版 exe 不通用,必须单独下载。

  • 若网络差,可手动下载 zip 包,通过 /mnt/d 传入 WSL,解压到上述目录,重启 Trae 窗口即可跳过自动下载。

  • 不要用 dnf install clangd 系统包代替,插件会优先使用自己的配套版本,版本不匹配会引发索引异常。

3.3 settings.json 关键配置(工作区或用户设置)

{
    "clang.compileCommands": "${workspaceFolder}/compile_commands.json",
    "clangd.backgroundIndexing": true,
    "files.exclude": {
        "**/tmp_build/**": true,
        "**/output/**": true,
        "**/package/**": true,
        "**/binarylibs/**": true
    }
}

3.4 连接 WSL 远程工作区

  • 左侧「远程资源管理器」→ WSL Targets → 选中 openEuler-22.03 → 在新窗口连接

  • 连接后左下角显示 WSL: openEuler-22.03,说明工作空间在 WSL 内

  • 在 WSL 终端中克隆源码(必须放在家目录):

    git clone https://gitcode.com/wang4721/openGauss-server.git ~/openGauss-server
    cd ~/openGauss-server
    

四、openGauss 编译(生成 compile_commands.json)

4.1 两种编译模式对比

模式 编译目录 是否生成 compile_commands.json 适用场景
传统 Make(不加 --cmake build :cross_mark: 不支持 仅测试编译
CMake 模式(加 -C tmp_build :white_check_mark: 需手动传入参数生成 开发调试、clangd 跳转

4.2 CMake 编译标准命令(生成编译数据库)

# 清理旧产物
rm -rf tmp_build output mppdb_temp_install

# 仅编译调试(不打包)
sh build.sh -m debug -C -3rd /home/wangchao/binarylibs/ --cmake_opt "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"

# 编译并打包安装包(加 -pkg)
sh build.sh -m debug -C -3rd /home/wangchao/binarylibs/ --cmake_opt "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON" -pkg

参数解释

  • -m debug:调试版本,带调试符号

  • -C:启用 CMake(等价 --cmake,兼容性更好)

  • -3rd:指定三方库路径

  • --cmake_opt "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"关键,强制生成 compile_commands.json

  • -pkg:生成离线安装包到 package 目录

编译完成后检查:

ls tmp_build/compile_commands.json   # 必须存在

五、clangd 跳转配置

5.1 创建编译数据库软链接

clangd 默认读取源码根目录的 compile_commands.json

cd ~/openGauss-server
ln -sf tmp_build/compile_commands.json compile_commands.json
ls -l compile_commands.json   # 确认链接有效

5.2 项目根目录 .clangd 配置文件(兜底头文件路径)

新建 ~/.clangd(或在项目根目录创建 .clangd),内容:

CompileFlags:
  Add:
    - -I${workspaceFolder}/src/include
    - -I${workspaceFolder}/src/common
    - -I${workspaceFolder}/tmp_build/include
    - -I/home/wangchao/binarylibs
  Remove: [-Werror]
Index:
  StandardLibrary: true
  Background: true
  Threads: 8
  Cache: ${workspaceFolder}/.clangd_cache
Diagnostics:
  UnusedIncludes: Strict

5.3 重启 clangd 服务

Trae 中快捷键 Ctrl+Shift+P → 输入 clangd: Clean restart language server,等待索引完成即可正常跳转、补全。


六、调试与实例操作

6.1 增量重编译

修改源码后无需全清,再次执行上述 CMake 编译命令即可增量构建(tmp_build 保留)。

6.2 初始化并启动数据库实例

# 初始化数据目录
./mppdb_temp_install/bin/gs_initdb -D ./data
# 启动数据库
./mppdb_temp_install/bin/gs_ctl start -D ./data
# 停止数据库
./mppdb_temp_install/bin/gs_ctl stop -D ./data

6.3 Trae 中 GDB 调试

安装 CMake Tools 插件后,选择 Debug 目标,附加 gaussdb 进程即可断点调试内核。


七、build.sh 关键参数速查表

参数 作用
-m debug/release 编译版本,调试用 debug
-C / --cmake 启用 CMake 编译分支(必须)
-3rd 路径 指定 binarylibs 三方库路径
--cmake_opt "xxx" 追加自定义 CMake 参数(必须包含 -DCMAKE_EXPORT_COMPILE_COMMANDS=ON
-pkg 编译完成后打包生成安装包
-bs 4096/8192 数据库块大小,默认 8192
-pm opengauss/lite 产品模式

八、高频故障排查

8.1 执行 --cmake 只生成 build,无 tmp_build

原因:参数未被脚本捕获。
解决:改用短参数 -C 替代 --cmake,并确保携带 -m debug 等参数。

8.2 tmp_build 内无 compile_commands.json

原因:未添加 --cmake_opt "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON"
解决:编译命令追加该参数,清理后重新编译。

8.3 cmake: command not found

sudo dnf install -y cmake gcc-c++

8.4 sshd 启动失败(Unit not found)

sudo dnf install openssh-server
# 确认 /etc/wsl.conf 中 systemd=true,重启 WSL

8.5 Trae 无法跳转、头文件找不到

  • 确认软链接 compile_commands.json 有效

  • 确认编译使用 CMake 并开启了导出参数

  • 重启 clangd 语言服务

  • 检查 .clangd 是否包含必要的头文件路径(binarylibs、tmp_build/include)

8.6 编译提示缺失 xxx-devel

执行第二章全套依赖安装命令补齐。

8.7 clangd 弹窗下载失败或卡住

  • 保持网络畅通等待,或手动下载对应 Linux 包放入 WSL 插件目录(见第三章 3.2 节)

  • 切勿取消,否则语言服务失效


九、附录:运维快捷命令

WSL 系统管理

wsl -l -v                     # 查看发行版
wsl --shutdown                # 关闭全部
wsl -t openEuler-22.03        # 单独关闭
wsl -d openEuler-22.03 -u root  # root 登录
wsl --unregister openEuler-22.03  # 彻底卸载(高危!数据全丢)

openGauss 编译与清理

# 清理全部产物
rm -rf tmp_build output mppdb_temp_install
# 重建软链接
ln -sf tmp_build/compile_commands.json compile_commands.json
# 查看系统版本
cat /etc/os-release
# 校验三方库
ls /home/wangchao/binarylibs

数据备份与恢复(安全)

  • 源码推 Git(首选)

  • 全量导出 WSL 快照(见 1.5 节)

  • 源码拷贝到 Windows 磁盘cp -r ~/openGauss-server /mnt/d/backup/


提醒:所有开发操作必须在 WSL 远程工作区内进行(左下角显示 WSL: openEuler-22.03),源码必须置于 WSL 家目录。

这样可以吗?我也是这样的,只是wsl2里是openEuler+openGauss

是的