为什么 Bazel under-link,我该如何解决?

Why does Bazel under-link and how do I fix it?

我正在尝试使用 Bazel 构建和打包 LCM。这适用于 "build" 部分,但最终结果是外部消费者无法使用的库(即 "package" 失败,因为包已损坏)。

LCM 使用 glib,我用 pkg_config_package (gory details) 导入它。更具体地说,LCM 在内部使用 glib ,但不会将其公开给用户。这意味着 消费者不需要 link glibliblcm.so应该这样做,消费者应该只需要link到LCM本身。

这一切都适用于上游(它使用 CMake 并做正确的事)。但是,由于某些未知原因,Bazel 似乎没有 linking liblcm.so 能说会道。如果我在相同的整体环境中使用 Bazel 构建可执行文件,Bazel 似乎知道 LCM 的用户也需要 link 来 glib。然而,当我尝试打包这个 LCM 供外部使用时,它坏了,因为 liblcm.so 没有被 link 编辑成 glib,这迫使消费者处理 LCM 的 private glib 依赖。

为什么 Bazel 没有 link 将 LCM 库转为 glib,我该如何修复它?

(p.s。我们与 libbot 有类似的问题...)

静态库不与其他静态库link。通过 Bazel 构建时,Bazel 会跟踪依赖关系,并在构建可执行文件时 link 针对所有依赖库。

这里有更多关于 linking 静态库的信息: Linking static libraries to other static libraries

提出的一个有趣的建议是取消归档这两个库,然后创建一个包含所有 .o 文件的新库。这有可能在 genrule 中实现。

显然,这是一个已知问题:https://github.com/bazelbuild/bazel/issues/492

我也不能只将 cc_library 设为 cc_binary,因为——虽然这会修复链接不足——但我无法在其他 Bazel 目标中使用该库。我也不能制作一个 cc_binary 来包装 cc_library,因为这样内部和外部消费者就不会使用同一个库。