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

如何用Bazel构建无需vcruntime DLL的Windows C++可执行文件

跨平台cc_binary静态链接运行时解决方案

核心思路

  • 用Bazel内置的select()函数做平台条件判断,仅在Windows构建时添加静态链接MSVC runtime的相关配置,Linux构建时自动忽略Windows专属配置,保证规则跨平台可用
  • 用Bazel官方提供的static_link_msvcrt特性替代硬写/MT编译标志,符合Bazel配置规范,避免和其他构建参数冲突

完整BUILD规则示例

cc_binary(
    name = "my_console_exec",
    srcs = [
        "main.c",
        # 补充其他你的源文件
    ],
    # 平台专属编译选项
    copts = select({
        "@bazel_tools//src/conditions:windows": [],
        "@bazel_tools//src/conditions:linux_x86_64": [],
        "//conditions:default": [],
    }),
    # 平台专属链接选项
    linkopts = select({
        "@bazel_tools//src/conditions:windows": [
            # 显式指定为控制台程序,符合你的需求
            "/SUBSYSTEM:CONSOLE",
        ],
        "//conditions:default": [],
    }),
    # 仅Windows下启用静态链接MSVC runtime,Linux自动忽略该配置
    features = select({
        "@bazel_tools//src/conditions:windows": ["static_link_msvcrt"],
        "//conditions:default": [],
    }),
)

验证方法

  • Windows构建完成后,执行dumpbin /dependents bazel-bin/your_exec_name.exe 检查依赖,输出中不会再出现vcruntime140.dll、vcruntime140_1.dll
  • Linux下直接执行正常构建命令即可生成适配当前系统的可执行文件,不会受Windows专属配置影响

注意事项

  • 不要在全局.bazelrc中硬写/MT等MSVC专属参数,会导致Linux构建时出现参数无法识别的报错
  • 如果项目依赖第三方库,需要确保第三方库也使用相同的MSVC runtime链接方式,避免运行时出现内存分配、异常处理相关的冲突

内容的提问来源于stack exchange,提问作者thinlizzy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 05:06:02