Я делаю общую библиотеку, которая использует Tensorflow. Сейчас я поместил его в исходное дерево Tensorflow как подпроект со следующим файлом BUILD:
cc_binary(
name = "recognizer.so",
srcs = glob(["recognizer.cpp"]),
linkshared = 1,
deps = [
"//tensorflow:сore"],
)
Все соединяются вместе, но я получаю общую библиотеку размером около 94 мегабайт, которая не зависит от libtensorflow_cc.so. На самом деле такого бинарного файла, как libtensorflow_cc.so, не существует.
Есть цель //tensorflow:libtensorflow_cc.so. Он объявлен как cc_binary, что означает (согласно Базелу), что я не могу зависеть от него. Более того, эта цель на самом деле не является общедоступной, что означает, что я могу создать ее, но не ссылаться на нее из другого подпроекта. По крайней мере, с Базелем.
Так есть ли способ сделать такую простую вещь?
Я не могу прокомментировать, почему libtensorflow.so или libtensorflow_cc.so являются внутренними. Но есть один прием, который вы можете сделать в Bazel, чтобы иметь возможность зависеть от разделяемой библиотеки, созданной cc_binary: объявить ее как источник правила cc.
cc_binary(
name = "liba.so",
srcs = [ "a.cc" ],
linkshared = 1
)
cc_binary(
name = "main",
srcs = [ "main.cc", "liba.so" ],
)
Теперь это крайне не поддерживается 🙂 На самом деле, мы собираемся изменить методы работы с общими библиотеками в следующие месяцы, поэтому я почти обещаю вам, что это сломается. Вы можете подписаться на https://github.com/bazelbuild/bazel/issues/1920 или следуйте bazel-dev @ для обновления.
Других решений пока нет …