You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 16:33:09