如何用Bazel构建Qt桌面应用?rules_foreign_cc构建失败求助
解决方案:用Bazel构建Qt C++桌面应用
一、解决当前报错的核心问题(Windows路径与Shell兼容)
你的报错源于Windows环境下Bazel调用WSL的bash执行构建脚本,导致路径解析混乱:
pwd: -W: invalid option:WSL的bash不支持pwd -W扩展选项mkdir: cannot create directory '/bazel-out':脚本试图创建Unix根目录路径,Windows无权限且不存在该路径
修复步骤:
- 强制Bazel使用Windows原生Shell
在项目根目录创建.bazelrc文件,添加配置:
build --shell_executable=C:/Windows/System32/cmd.exe build --experimental_use_shell_env
让Bazel用cmd而非bash执行构建脚本,避免Unix路径解析错误。
- 修正rules_foreign_cc的cmake规则配置
原src/BUILD的cmake规则配置错误,修改为:
load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake") cmake( name = "my_qt_project", # 指向当前目录所有源码(包含CMakeLists.txt) lib_source = ".", # 指定生成可执行文件而非默认库 output_binaries = ["HelloWorld.exe"], # 传递Qt路径给CMake,避免硬编码 cmake_options = [ "-DCMAKE_PREFIX_PATH=C:/Qt/6.5.1/mingw_64/lib/cmake", "-DCMAKE_CXX_COMPILER=g++", # 确保使用Qt配套的MinGW编译器 ], )
- 简化CMakeLists.txt路径配置
移除硬编码的Qt路径,改用Bazel传递的参数:
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 依赖Bazel传递的CMAKE_PREFIX_PATH查找Qt find_package(Qt6 REQUIRED COMPONENTS Widgets) qt_standard_project_setup() qt_add_executable(HelloWorld main.cpp ) target_link_libraries(HelloWorld PRIVATE Qt6::Widgets)
二、更优方案:使用专门的Qt Bazel规则(rules_qt)
rules_foreign_cc是通用外部构建规则,对于Qt这类有MOC/RCC/UIC复杂流程的框架,专用的rules_qt更高效可靠。
配置步骤:
- 更新WORKSPACE文件
替换原rules_foreign_cc配置,引入rules_qt:
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") # 引入rules_qt http_archive( name = "rules_qt", urls = ["https://github.com/justbuchanan/rules_qt/archive/refs/tags/v6.5.0.tar.gz"], strip_prefix = "rules_qt-6.5.0", ) load("@rules_qt//qt:repositories.bzl", "qt_repositories") # 配置本地Qt安装路径 qt_repositories( qt_version = "6.5.1", qt_host_path = "C:/Qt/6.5.1/mingw_64", platforms = ["windows"], )
- 替换src/BUILD为Qt专用规则
删除原cmake规则,改用:
load("@rules_qt//qt:defs.bzl", "qt_cc_binary") qt_cc_binary( name = "HelloWorld", srcs = [ "main.cpp", ], qt_deps = [ "@qt//:widgets", ], # 如有.ui/.qrc/.h需要MOC,可添加以下配置 # moc_headers = [], # qrc_files = [], )
删除冗余CMake配置
改用rules_qt后无需CMakeLists.txt,直接删除根目录和src目录下的对应文件。执行构建
运行命令:
bazel build //src:HelloWorld
三、单仓库多平台(桌面+Android)扩展建议
如果要在同一仓库添加Android应用:
- Qt Android应用:继续用rules_qt,添加Android平台的Qt配置;
- 原生Android应用:引入
rules_android,在单独的android/目录下配置BUILD规则; - 通过Bazel的
platforms规则区分不同平台的构建目标。
内容的提问来源于stack exchange,提问作者srilakshmikanthanp
相关产品推荐
相关产品推荐

