为什么Bazel需要链接,我如何修复它?

为什么Bazel需要链接,我如何修复它?,bazel,Bazel,我正在尝试用Bazel构建和打包。这适用于“构建”部分,但最终结果是外部使用者无法使用库(即“包”失败,因为包已损坏) LCM使用glib,我使用()导入它。更具体地说,LCM在内部使用glib,但不向用户公开。这意味着消费者不需要把油嘴滑舌联系起来liblcm。因此应该做到这一点,消费者只需要链接到LCM本身 这一切都适用于上游(它使用CMake并做正确的事情)。然而,出于某种未知的原因,Bazel似乎并没有将liblcm与glib联系起来。如果我在相同的总体环境中使用Bazel构建一个可执行

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

LCM使用glib,我使用()导入它。更具体地说,LCM在内部使用glib,但不向用户公开。这意味着消费者不需要把油嘴滑舌联系起来
liblcm。因此
应该做到这一点,消费者只需要链接到LCM本身

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

为什么Bazel没有将LCM库链接到glib,我该如何修复它


(另外,我们在libbot上也有类似的问题…

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

这里有关于链接静态库的更多信息:


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

显然,这是一个已知的问题:


我也不能把
cc_库
变成
cc_二进制
,因为这样可以修复欠链接,但我不能在其他Bazel目标中使用该库。我也不能制作一个包装
cc\u库的
cc\u二进制文件
,因为这样内部和外部使用者就不会使用同一个库。

我不是在生成一个静态库。。。这种行为是错误的,对于共享库来说是错误的。你是说由于sojme静态库遗留问题,Bazel无法生成未损坏的共享库吗?现有的行为并不是为了生成供外部使用的共享库。它可以使TDD往返更快,例如,在编辑测试时,只有测试被重新编译和重新链接,而不是它的依赖项。在许多情况下,测试和所有依赖项的静态链接将比测试+加载的链接花费更多的时间。好吧,严格来说,这不是真的,尽管有点黑客味-您仍然可以将.so放入cc_库/cc_二进制文件的src中,并且它会起作用(这是让bazel知道预编译库的当前机制)。但它的表现力不够,这就是为什么我们研究第492期中提到的“可传递库”。总之,bazel在“在开源世界中开发”方面还有很多需要改进的地方。