windows下,使用msys2解决烦人的-fmodules-ts

问题产生

我的环境是 windows11 + MSYS2 + cmake + Ninja。
MSYS2 使用 GCC 15.1.0 x86_64-w64-mingw32(urct64),cmake 就直接用默认工具包生成了。

长期将cmake定格为 3.10 的我这次突然心血来潮定格为 4.0。
生成之后,我的 clangd 就在 main.cpp 下爆出了三个离谱的错误:

Unknown argument: '-fmodules-ts'clang(drv_unknown_argument)
Unknown argument: '-fmodule-mapper=CMakeFiles\project.dir\src\main.cpp.obj.modmap'clang(drv_unknown_argument)
Unknown argument: '-fdeps-format=p1689r5'clang(drv_unknown_argument)

但正常项目是没有任何问题的——我并没有在项目使用 module 特性,这是怎么回事呢?

问题解决过程

首先查看 compile_commands.json

[
{
  "directory": "project/build",
  "command": "g++ -DTCOD_NO_THREADS -isystem project/submodules/vcpkg/installed/x64-mingw-dynamic/include -O3 -DNDEBUG -std=gnu++23 -fmodules-ts -fmodule-mapper=CMakeFiles\\project.dir\\src\\main.cpp.obj.modmap -MD -fdeps-format=p1689r5 -x c++ -o CMakeFiles\\project.dir\\src\\main.cpp.obj -c project\\src\\main.cpp",
  "file": "project\\src\\main.cpp",
  "output": "CMakeFiles\\project.dir\\src\\main.cpp.obj"
}
]

发现使用了 -fmodules-ts -fmodule-mapper 指令,这是启动 c++ 的 module 机制。

在 cmake 禁止 module 后重新生成发现没什么用。

set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API OFF)

检查程序还能够继续运行无意外,那么问题就要定位到 clangd 了。
查询支持情况后,发现是 clang 目前只支持部分 module,clang 无法理解这三个参数,clangd 自然要报错了。

解决

处于无任何问题,是msys2 内 clangd 支持问题,在.clangd 里忽略这些报错就可以了。
添加如下配置:

  Remove: 
    - "-fmodules-ts"
    - "-fdeps-format=p1689r5"
    - "-fmodule-mapper=*"

重启 clangd 即可解决。

posted @ 2025-07-15 22:37  ChickenRice  阅读(110)  评论(1)    收藏  举报