我正在做一个使用 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,这意味着(根据 bazel)我不能依赖它。此外,这个目标实际上是非公开的,这意味着我可以构建它但不能从另一个子项目中引用它。至少有 bazel。
那么,有什么办法可以做到这么简单的事情吗?
最佳答案
我无法评论为什么 libtensorflow.so 或 libtensorflow_cc.so 是 :internal。但是您可以在 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@ 获取更新。
关于c++ - Tensorflow:与共享库的动态链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43075683/