如何在bazel run期间使系统DLL可用?MinGW环境问题求助
解决Bazel在Windows MinGW环境下
bazel run的DLL缺失问题 针对你遇到的0xc0000139错误(DLL缺失/损坏),以下是几个实用的解决方案,可逐一尝试:
1. 确认bazel run执行环境的PATH是否正确
首先排查Bazel运行时的PATH是否真的包含C:\tools\msys64\mingw64\bin。执行以下命令直接打印运行环境的PATH:
bazel run --compiler=mingw-gcc -- cmd /c echo %PATH%
如果输出中没有目标路径,说明Bazel没有继承你设置的系统PATH,需要显式传递:
# 方法1:先设置PATH再执行bazel run set "PATH=C:\tools\msys64\mingw64\bin;%PATH%" && bazel run --compiler=mingw-gcc //:test_my_lib # 方法2:用Bazel的--action_env参数传递PATH bazel run --compiler=mingw-gcc --action_env=PATH="C:\tools\msys64\mingw64\bin;%PATH%" //:test_my_lib
2. 将DLL复制到Bazel运行目录
Bazel默认从bazel-bin下的目标目录执行程序,直接将所需DLL复制到该目录即可绕过PATH依赖。在BUILD文件中操作:
第一步:定义DLL文件组
filegroup( name = "mingw_required_dlls", srcs = [ "C:/tools/msys64/mingw64/bin/gtest.dll", "C:/tools/msys64/mingw64/bin/libstdc++-6.dll", "C:/tools/msys64/mingw64/bin/libgcc_s_seh-1.dll", ], visibility = ["//visibility:public"], )
第二步:在测试目标中添加data依赖
cc_test( name = "test_my_lib", srcs = ["test_my_lib.cc"], deps = [":my_lib", "@com_google_googletest//:gtest_main"], # 将DLL文件组加入data,Bazel会自动复制到运行目录 data = [":mingw_required_dlls"], compiler = "mingw-gcc", )
3. 修正MinGW工具链配置,避免路径冲突
CI环境中存在两个MinGW实例,需确保Bazel使用的是C:\tools\msys64\mingw64下的版本:
- 在项目根目录的
.bazelrc中添加工具链配置:
build:mingw --crosstool_top=@mingw_toolchain//:toolchain build:mingw --host_crosstool_top=@mingw_toolchain//:toolchain
- 确保你的MinGW工具链定义(如
@mingw_toolchain//:toolchain)中,path字段明确指向C:/tools/msys64/mingw64,避免误用到Git附带的MinGW版本。
4. 正确使用cc_import(针对第三方DLL)
如果用cc_import引入DLL,需同时在deps和data中声明,确保链接和运行阶段都能访问:
cc_import( name = "gtest_dll", # 链接用的静态库 interface_library = "C:/tools/msys64/mingw64/lib/libgtest.dll.a", # 运行时需要的DLL shared_library = "C:/tools/msys64/mingw64/bin/gtest.dll", ) cc_test( name = "test_my_lib", ... deps = [":my_lib", ":gtest_dll", "@com_google_googletest//:gtest_main"], data = [":gtest_dll"], )
以上方案中,方案2(复制DLL到运行目录)最稳定,无需依赖环境变量;如果PATH配置是核心问题,方案1可快速验证。
内容的提问来源于stack exchange,提问作者cstal
相关产品推荐
相关产品推荐

