Windows下使用clang++实现增量构建/加速编译的方法
clang++ 增量链接与编译提速方案
关于clang++的增量链接支持
clang++本身没有和Visual Studio /I 完全对应的增量链接选项,但可以通过LLVM自带的lld链接器实现类似功能:
- 如果你用的是LLVM的
lld-link.exe(Windows下的lld链接器),可以在clang++的编译参数里加上-fuse-ld=lld指定用lld链接,再通过-Wl,-incremental把增量链接参数传递给链接器。
修改后的VS Code任务配置args示例:
"args": [ "-fdiagnostics-color=always", "-g", "${workspaceFolder}\\src\\Tests\\*.cpp", "${workspaceFolder}\\src\\jet\\*.cpp", "-o", "${workspaceFolder}\\bin\\Tests\\tests.exe", "-I${workspaceFolder}\\src\\external\\googletest\\include", "-I${workspaceFolder}\\src\\jet", "-L${workspaceFolder}\\src\\external\\googletest\\lib", "-lgtest", "-lgtest_main", "-fuse-ld=lld", "-Wl,-incremental" ]
开启后会生成.ilk增量链接文件,后续仅重新编译改动的代码并增量链接,能显著减少重复编译的耗时。
无增量链接时的替代提速方案
如果没法用增量链接,下面这些方案也能大幅压缩编译时间:
1. 用编译缓存工具(最推荐)
ccache或者sccache这类工具会缓存已经编译过的目标文件,只有当源文件或头文件改动时才重新编译。配置起来也简单:
- 把VS Code任务里的
command改成ccache,然后把clang++的路径作为第一个参数传入,示例:
"command": "ccache", "args": [ "C:\\clang+llvm-18.1.8-x86_64-pc-windows-msvc\\bin\\clang++.exe", // 原来的所有编译参数... ]
前提是你已经在系统里装了ccache或sccache,并配置好了环境变量。
2. 拆分模块,编译静态库
把业务代码(src/jet/)单独编译成静态库,只有业务代码改动时才重新编译这个库,测试代码只需要链接这个库就行,不用每次都编译所有业务文件:
- 先加一个构建任务编译业务代码为目标文件:
{ "type": "cppbuild", "label": "Build Jet Static Lib", "command": "C:\\clang+llvm-18.1.8-x86_64-pc-windows-msvc\\bin\\clang++.exe", "args": [ "-fdiagnostics-color=always", "-g", "-c", // 只编译不链接 "${workspaceFolder}\\src\\jet\\*.cpp", "-I${workspaceFolder}\\src\\jet", "-o", "${workspaceFolder}\\lib\\jet\\jet.obj" ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": ["$gcc"], "group": "build" }
- 再用
llvm-ar把目标文件打包成静态库:
llvm-ar rcs ${workspaceFolder}\\lib\\libjet.a ${workspaceFolder}\\lib\\jet\\*.obj
- 最后修改测试代码的构建任务,只编译测试文件并链接静态库:
"args": [ "-fdiagnostics-color=always", "-g", "${workspaceFolder}\\src\\Tests\\*.cpp", "-o", "${workspaceFolder}\\bin\\Tests\\tests.exe", "-I${workspaceFolder}\\src\\external\\googletest\\include", "-I${workspaceFolder}\\src\\jet", "-L${workspaceFolder}\\lib", "-ljet", // 链接业务静态库 "-L${workspaceFolder}\\src\\external\\googletest\\lib", "-lgtest", "-lgtest_main" ]
3. 开启并行编译
clang++支持-j参数启用多线程编译,利用CPU多核加速,比如-j8就是用8个线程编译,直接把这个参数加到args里就行。
4. 精简编译依赖
- 调试阶段可以用
-g1替代-g减少调试信息生成(但不建议长期用,会影响调试体验); - 清理代码里不必要的头文件包含,用前置声明替代头文件引入,减少编译时的依赖解析时间。
内容的提问来源于stack exchange,提问作者user26018047
相关产品推荐
相关产品推荐

