Почему Bazel под ссылкой и как это исправить?
Я пытаюсь собрать и упаковать LCM с помощью Bazel. Это работает для части "сборки", но конечным результатом является библиотека, которую нельзя использовать внешним потребителям (т. Е. "Пакет" терпит неудачу, потому что пакет поврежден).
LCM использует glib, который я импортирую pkg_config_package
( кровавые подробности). В частности, LCM использует glib для внутреннего использования, но не предоставляет его пользователям. Это означает, что потребители не должны связывать glib; liblcm.so
должны сделать это, и потребители должны будут только связаться с самой LCM.
Все это прекрасно работает с апстримом (который использует CMake и делает правильные вещи). Базель, однако, похоже, не связывает liblcm.so
чтобы вспыхнуть, по неизвестной причине. Если я создаю исполняемый файл с Bazel в той же общей среде, Bazel, похоже, знает, что пользователям LCM также необходимо подключиться к glib. Однако, когда я пытаюсь упаковать этот LCM для внешнего использования, он не работает, потому что liblcm.so
не связан с glib, что заставляет потребителей иметь дело с частной зависимостью glib от LCM.
Почему Bazel не связывает библиотеку LCM с glib, и как мне это исправить?
(PS У нас есть похожие проблемы с libbot...)
2 ответа
По-видимому, это известная проблема: https://github.com/bazelbuild/bazel/issues/492.
Я не могу просто сделать cc_library
cc_binary
либо потому, что - хотя это исправило бы недоссылку - тогда я не могу использовать библиотеку в других целях Bazel. Я не могу сделать cc_binary
это оборачивает cc_library
потому что тогда внутренние и внешние потребители не используют одну и ту же библиотеку.
Статические библиотеки не связаны с другими статическими библиотеками. При сборке через Bazel Bazel отслеживает зависимости и будет ссылаться на все зависимые библиотеки при сборке исполняемого файла.
Здесь есть больше информации о связывании статических библиотек: Связывание статических библиотек с другими статическими библиотеками
Было выдвинуто одно интересное предложение: разархивировать обе библиотеки, а затем создать новую библиотеку со всеми файлами.o. Это может быть достигнуто в целом.