使用Bazel构建CMake项目遇路径错误,求解决方法
解决Bazel构建CMake项目的路径错误并掌握构建方法
问题场景
项目目录结构:
BazelCmake/ ├── WORKSPACE.bazel ├── Source/ │ ├── BUILD.bazel │ ├── CMakeLists.txt │ └── tutorial.cpp └── Build/
各文件核心内容:
- WORKSPACE.bazel:配置了rules_foreign_cc依赖与pcre远程仓库
- Source/BUILD.bazel:初始配置为构建pcre第三方库
- Source/tutorial.cpp:简单Hello World程序
- Source/CMakeLists.txt:定义Tutorial可执行项目
执行bazel build //:pcre时触发错误:
Starting local Bazel server and connecting to it... ERROR: error loading package '': Label '@rules_foreign_cc//foreign_cc:repositories.bzl' is invalid because 'foreign_cc' is not a package; perhaps you meant to put the colon here: '@rules_foreign_cc//:foreign_cc/repositories.bzl'? INFO: Elapsed time: 6.982s INFO: 0 processes. FAILED: Build did NOT complete successfully (0 packages loaded)
错误原因
使用的rules_foreign_cc 0.1.0版本目录结构与官方文档(对应新版本)不匹配,旧版本中foreign_cc是根目录文件夹而非子包,导致加载路径错误;同时当前BUILD配置目标是第三方pcre库,而非本地的CMake项目。
分步解决方案
1. 修正WORKSPACE.bazel的依赖加载路径
修改WORKSPACE.bazel中的load语句:
# 原错误语句 # load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies") # 修改为正确路径 load("@rules_foreign_cc//:foreign_cc/repositories.bzl", "rules_foreign_cc_dependencies")
2. 调整Source/BUILD.bazel构建本地CMake项目
替换BUILD.bazel内容为构建本地项目的配置:
load("@rules_foreign_cc//:foreign_cc/defs.bzl", "cmake") cmake( name = "Tutorial", srcs = glob(["**"]), # 包含当前目录所有源文件与CMake配置文件 out_binaries = ["Tutorial"], # 指定生成的可执行文件名称 )
3. 修正CMakeLists.txt的文件名错误
CMakeLists.txt中源文件名与实际文件不符,修改如下:
# 原错误语句 # add_executable(Tutorial tutorial.cxx) # 修改为实际文件名 add_executable(Tutorial tutorial.cpp)
4. 执行正确的构建命令
进入BazelCmake父目录,执行:
bazel build //Source:Tutorial
验证结果
构建成功后,可执行文件位于bazel-bin/Source/Tutorial,运行该文件会输出:
Hello
核心知识点
- Bazel标签格式:
@仓库名//包路径:目标名,包路径是包含BUILD文件的目录,根目录包用//:开头。 - rules_foreign_cc版本差异:不同版本的文件路径可能不同,建议使用较新稳定版以匹配官方文档。
- CMake规则使用:构建本地项目时,需确保
srcs包含所有必要的CMake配置和源文件,out_binaries指定生成的可执行文件名称。
内容的提问来源于stack exchange,提问作者MikeJ
相关产品推荐
相关产品推荐

