为什么Bazel链接不足以及如何修复它?

时间:2017-06-23 14:25:46

标签: bazel

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

LCM使用glib,我使用pkg_config_packagegory details)导入。更具体地说,LCM在内部使用glib ,但不向用户公开。这意味着消费者不需要链接glib ; liblcm.so应该这样做,消费者只需要链接到LCM本身。

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

为什么Bazel没有将LCM库链接到glib,我该如何解决?

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

2 个答案:

答案 0 :(得分:1)

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

我也不能只使cc_library成为cc_binary,因为 - 虽然这会解决欠链接问题 - 但我无法在其他Bazel中使用该库目标。我也不能制作一个包裹cc_binary的{​​{1}},因为内部和外部消费者都没有使用相同的库。

答案 1 :(得分:-1)

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

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

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