我正在尝试使用Bazel构建和打包LCM。这适用于“构建”部分,但最终结果是外部使用者无法使用的库(即“包”失败,因为包已损坏)。
LCM使用glib,我使用pkg_config_package
(gory 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有类似的问题......)
答案 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文件的新库。这可能是在一个规则中实现的。