全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++如何使用Bazel构建系统_c++ Google的构建工具入门【工程化】

Bazel构建C++项目核心是编写WORKSPACE和BUILD文件,通过声明式设计实现可复现、可缓存的高效构建;WORKSPACE定义项目名与外部依赖,BUILD用cc_library/cc_binary/cc_test组织目标,配合bazel build/run/test等命令完*流程。

用 Bazel 构建 C++ 项目,核心是写好 WORKSPACEBUILD 文件,让 Bazel 理解你的依赖和编译规则。它不是“配置越复杂越强”,而是靠声明式、可复现、可缓存的设计提升大型项目的构建效率。

初始化 WORKSPACE:声明项目身份和外部依赖

每个 Bazel 项目根目录必须有 WORKSPACE 文件(可为空,但建议显式声明)。它定义项目名、加载外部依赖(如 googletest、abseil)和启用 C++ 规则。

  • workspace(name = "my_project") 命名项目,这个名字会在引用内部目标时用到(如 //:main
  • 若需 Google 开源库,用 http_archive 引入,例如接入 absl
    load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
    http_archive(
        name = "com_google_absl",
        urls = ["https://github.com/abseil/abseil-cpp/archive/refs/tags/20250116.0.tar.gz"],
        strip_prefix = "abseil-cpp-20250116.0",
    )
    
  • 确保已启用 C++ 工具链:Bazel 6.0+ 默认启用;老版本需在 WORKSPACE 中加 load("@rules_cc//cc:defs.bzl", "cc_library")

编写 BUILD 文件:用目标(target)组织代码

BUILD 文件放在每个模块目录下,声明该目录能构建什么。C++ 最常用的是 cc_binarycc_librarycc_test

  • cc_library 封装头文件和实现,供其他目标链接:
    cc_library(
        name = "utils",
        srcs = ["utils.cc"],
        hdrs = ["utils.h"],
        visibility = ["//visibility:public"],
    )
    
  • cc_binary 构建可执行文件,通过 deps 显式声明依赖:
    cc_binary(
        name = "app",
        srcs = ["main.cc"],
        deps = [":utils", "@com_google_absl//absl/strings:strings"],
    )
    
  • cc_test 写单元测试,自动集成 gtest(如果已引入):
    cc_test(
        name = "utils_test",
        srcs = ["utils_test.cc"],
        deps = [":utils", "@com_google_googletest//:gtest_main"],
    )
    

常用命令:从构建到测试一步到位

Bazel 命令统一以 bazel 形式运行,支持通配符和标签语法(如 //... 表示所有子包)。

  • bazel build //:app —— 编译目标,输出在 bazel-bin/
  • bazel run //:app —— 构建并立即运行
  • bazel test //... —— 运行当前项目下所有测试
  • bazel query 'deps(//:app)' —— 查看依赖图,调试依赖问题很实用
  • bazel clean --expunge —— 彻底清空构建缓存(慎用,但解决诡异构建残留时有效)

小技巧:让 C++ 开发更顺手

Bazel 默认使用系统工具链,但你可以控制编译器行为、启用警告或自定义 C++ 标准。

  • .bazelrc 中设置全局 C++ 选项:
    build --cxxopt=-std=c++17
    build --copt=-Wall --copt=-Wextra
    build --linkopt=-static-libstdc++
    
  • cc_toolchain 切换 GCC/Clang 或交叉编译(进阶场景,初学者可暂不深究)
  • 生成编译数据库(compile_commands.json)供 VS Code 或 clangd 使用:
    bazel run @rules_cc//tools/cpp:run_compilation_database -- --output=compile_commands.json
    

基本上就这些。Bazel 的学习曲线不在语法多难,而在于转变思维——从“我怎么让编译器干活”变成“我如何精确描述模块关系”。写好 BUILD 文件,就是为工程立下契约。


# c++  # js  # git  # json  # go  # github  # app  # 工具  # ai  # google  # vs code  # 封装  # 数据库  # 写好  # 的是  # 进阶  # 放在  # 目下  # 会在  # 自定义  # 但你  # 暂不  # 开源 


相关文章: 上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  ,在苏州找工作,上哪个网站比较好?  公司网站设计制作厂家,怎么创建自己的一个网站?  如何通过远程VPS快速搭建个人网站?  宿州网站制作公司兴策,安徽省低保查询网站?  制作网页的网站有哪些,电脑上怎么做网页?  建站之星收费标准详解:套餐费用及年费价格表一览  建站之星备案是否影响网站上线时间?  如何在西部数码注册域名并快速搭建网站?  淘宝制作网站有哪些,淘宝网官网主页?  如何选择高效便捷的WAP商城建站系统?  建站之星代理商如何保障技术支持与售后服务?  建站主机如何选?性能与价格怎样平衡?  Python多线程使用规范_线程安全解析【教程】  如何在云指建站中生成FTP站点?  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  制作网站公司那家好,网络公司是做什么的?  ,交易猫的商品怎么发布到网站上去?  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何零基础开发自助建站系统?完整教程解析  寿县云建站:智能SEO优化与多行业模板快速上线指南  C#如何在一个XML文件中查找并替换文本内容  广州网站建站公司选择指南:建站流程与SEO优化关键词解析  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  山东网站制作公司有哪些,山东大源集团官网?  如何在景安服务器上快速搭建个人网站?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  如何做静态网页,sublimetext3.0制作静态网页?  如何获取上海专业网站定制建站电话?  如何快速搭建FTP站点实现文件共享?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  建站之星北京办公室:智能建站系统与小程序生成方案解析  成都网站制作报价公司,成都工业用气开户费用?  网站制作网站,深圳做网站哪家比较好?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  如何用腾讯建站主机快速创建免费网站?  如何快速辨别茅台真假?关键步骤解析  Swift中循环语句中的转移语句 break 和 continue  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  官网建站费用明细查询_企业建站套餐价格及收费标准指南  如何在IIS7中新建站点?详细步骤解析  建站主机与服务器功能差异如何区分?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  如何在阿里云虚拟服务器快速搭建网站?  临沂网站制作企业,临沂第三中学官方网站?  常州自助建站费用包含哪些项目?  如何生成腾讯云建站专用兑换码? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。