如何用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
相关产品推荐
相关产品推荐

