点击 <C 语言编程核心突破> 快速C语言入门
vscode + clang + clangd 解锁 modules
- 前言
- 一、准备
- 二、使用
- 备注:
- 总结
前言
要解决问题: 昨天解锁VS
使用modules
, 但是不完美, 没有代码提示和补全了, 今天用 vscode + clang + clangd
解锁 modules
, 同时还有代码补全及提示.
想到的思路: 误打误撞, 发现clang18
也支持modules
, 配合 vscode 及 clangd
还可以有代码提示和补全.
其它的补充: 原来我以为没有头文件就没有代码补全, 看来我想多了, 这不是问题, 可以解决.
一、准备
我个人是使用 msys2
资源管理系统来管理工具链, 目前 msys2
最新的 clang
版本是 clang18
, 赶紧升级, 途中遇到了一些困难, 就是系统中有很多库都依赖老版本的工具链上的库, 为了升级, 只能暂时不管这些, 如果从事生产, 那不太可行, 对于我这种小打小闹的, 就没什么了, 总之自己做主吧.
首先, clang
没有给你准备好 std
标准模块, 需要自己编译, 你需要找到 std.cppm
这个文件, 如果找不到, 那可能版本不对, 就编译不了了.
为了能够实现代码补全, 配合 std.cppm
的还有一大堆 .inc
文件, 所以就不列出具体内容了, 太多放不下.
预编译的过程十分简单, 在终端下, 输入如下命令, 注意, 为了保证二进制兼容, 尽量使用你平常编译时的命令, 这个和 VS
是一样的, 编译命令不一样, 模块就无法兼容.
C++
标准必须在 C++20
及以上, 这个是必选项, 因为默认的不是这个版本.
clang++ -std=c++20 std.cppm --precompile -o std.pcm
使用的时候也是一条命令:
clang++ -std=c++20 main.cpp -fmodule-file=std=std.pcm std.pcm -o main.exe
注意使用模块的格式: 一个是告诉编译器, std
模块的文件名, 一个是链接的文件名, 我试过, 缺一个都不行, 并且要给出路径, 要不然编译器不知道在哪.
-fmodule-file=std=std.pcm std.pcm
二、使用
使用起来就非常简单了, 配合 clangd
需要做如下设置:
在 compile_flags.txt
这个文件下(如果不知道这个文件, 自己查一下或者看我的设置编译链的文章2022-03-30 VsCode中使用clangd插件的各种设置)
-xc++
-std=c++20
-stdlib=libc++
-fexperimental-library
-fmodule-file=std=E:\msys64\clang64\share\libc++\v1\std.pcm
-Wall
在 tasks.json
文件中进行相应配置:
注意 std.pcm
的文件路径, 如果你不知道怎么设置, 直接使用绝对路径, std.cppm 和 std.pcm
要放在一起, 这个是补全和代码提示的需要.
同时, 编译命令要与编译模块时的命令相同, 否则可能产生问题.
"args": ["-glldb","-std=c++20","-fmodule-file=std=std.pcm","std.pcm","${fileBasename}","-o","${fileDirname}\\${fileBasenameNoExtension}.exe",],
现在可以愉快的使用带有代码补全和提示的模块引入了.
备注:
还有疑问, 可参考 clang18
官方文档 Standard C++ Modules
总结
离 c++20
标准已经过去4年了, 终于实现了 modules
的功能, 且解决了代码提示和补全的后顾之忧, 可以愉快的编程了.
点击 <C 语言编程核心突破> 快速C语言入门