Apollo 的依赖查找机制可以想象成一个聪明的图书管理员帮你找参考书的过程,接下来用简单步骤给解释一下:
1.书单准备(BUILD文件)
每个模块的 BUILD 文件就像你的参考书清单,比如:
cc_binary(
name = "my_module",
deps = [
"//modules/common:math", # 内部书架的书
"@eigen//:eigen", # 外部借阅的书
]
)
2.图书馆登记 (WORKSPACE 文件)
总目录 WORKSPACE 记录了所有外部图书馆的位置:
http_archive(
name = "eigen",
urls = ["https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.gz"],
)
3.找书流程 (Bazel 的工作方式)
当编译你的模块时,Bazel 会:
- 先检查本地书架://modules/common 这种路径指向 Apollo 自己的代码。
- 再查外部图书馆:带 @ 符号的依赖会从 WORKSPACE 指定的网址下载。
- 自动处理连环借书:如果 A 依赖 B,B 又依赖 C,Bazel 会全部自动解决。
4.智能缓存系统
就像图书馆会把常用书放在前台,Bazel 会缓存下载的依赖,第二次编译时直接使用缓存,速度更快。
5.实际案例
当你的模块需要 Eigen 数学库时:
① Bazel 先在本地找有没有 @eigen。
② 找不到就去 WORKSPACE 里写的网址下载。
③ 解压后存放在缓存目录(默认在 ~/.cache/bazel)。
④ 自动把头文件路径和库文件路径加入到编译命令中。
6.常见问题
- 如果找不到依赖:检查 BUILD 文件里的依赖名是否拼写正确。
- 查看 WORKSPACE 里对应的仓库是否正确定义。
- 可以运行 bazel query @eigen//… 验证依赖是否存在。