0%

Windows 下 Lazyvim Treesitter 编译失败

1. 问题背景

在 Windows 环境下,通过 Scoop 安装 Neovim 并配置 LazyVim。在尝试为 NimGoYAML 等语言安装代码高亮(Treesitter 解析器)时,遭遇了连环报错,导致即使安装了 LSP,代码依然处于“黑白状态”。

2. 核心故障描述

2.1 报错现象

每次启动 Neovim 或执行 :TSInstall 时,系统弹出大量的编译错误。

2.2 具体报错信息

最关键的报错信息如下:

Plaintext

1
2
3
4
C:/Users/r3tr0/scoop/apps/gcc/13.2.0/.../bin/ld.exe: 
cannot open output file \\?\C:\Users\r3tr0\AppData\Local\Temp\nvim\tree-sitter-xml\xml\parser.so:
Invalid argument
collect2.exe: error: ld returned 1 exit status

2.3 根因分析

  • 路径冲突:Windows 的长路径前缀 \\?\ 与 GCC 的链接器 ld.exe 存在兼容性 Bug,导致无法写入临时文件。
  • 链接方式问题:GCC 在 Windows 上默认动态链接标准库,而 yamlxml 等包含 C++ 代码的模块在加载时常因找不到 libstdc++-6.dll 或符号解析失败而崩溃。
  • 配置时机:在 LazyVim 架构下,自定义配置如果优先级不够高,插件会在环境修复前尝试自动安装,导致反复报错。

3. 解决方案

3.1 使用clang替换默认的gcc编译器

1
2
3
4
# powershell 
scoop install llvm
$env.CC = "clang" # 修改环境变量,将默认编译器临时修改为clang
nvim

这样进入nvim之后lazyvim会自动将clang作为默认编译器,默认编译安装所有的语言,之后进入nvim就不会遇到报错了。

在解决问题的过程中,我察觉到了是C编译器的问题,但是我通过修改lua配置文件,指定zig为默认编译器,但是没有被nvim识别,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
>return {
{
"nvim-treesitter/nvim-treesitter",
opts = function(_, opts)
local install = require("nvim-treesitter.install")

-- 1. 强制编译器顺序:Zig
install.compilers = { "zig" }
install.prefer_git = true

-- 2. 精简安装列表,确保核心语言稳定
opts.ensure_installed = {
"nim", "go", "lua", "python", "vim", "markdown", "yaml"
}

-- 3. 路径补丁:确保解析器能被正确加载
vim.opt.runtimepath:append(vim.fn.stdpath("data") .. "/site")
end,
},
>}

在重启nvim后仍然报错…

最后在网上查到了解决方案如上。