这篇文章上次修改于 903 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

如果希望通过 .so 和头文件的方式使用 b,但是 b 又依赖 a,如何让 b 的 .so 中包含 a 呢。那就是将 b 编译为 .so 时,BUILD 文件如下书写:

cc_binary(  
    name = "b",
    srcs = ["b.cc", "b.h"],
    deps = ["//example/a:a"],
    linkshared=True,
)

以上 BUILD 中有两个关键点:

  • cc_binary 而不是 cc_library,因为如果编译为 cc_library,将不会包含 a。
  • linkshared=True

编译好的 .so 见 bazel-bin 文件夹。

要想成功使用 b.h 和 b.so,还要注意,b.h 中不要有 c++ 库以外的头文件,将这些头文件放到 b.cc 中,然后将相关的数据类型在 b.h 中前置声明。

另外还需要查看 .so 中包含哪些库文件:

ldd xxx.so

并将依赖的库文件复制到统一的地方。