Почему 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. Это может быть достигнуто в целом.

Другие вопросы по тегам