从tensorflow_cc和tensorflow_framework生成静态库

时间:2018-01-08 17:21:05

标签: tensorflow static-linking bazel

据我所知,使用bazel我只能生成libtensorflow_cc.solibtensorflow_framework.so。 我需要生成与位置无关的静态库-fPIC),因为我稍后会将它们链接到我自己的动态库。

我发现this answer建议使用项目中包含的Makefile。 我已成功使用它来替换{​​{1}},但我该怎么做才能替换libtensorflow_cc.so

2 个答案:

答案 0 :(得分:3)

不是一个真正的答案,但评论的时间太长了。

我设法做了类似于你在Windows上使用Bazel提到的内容。特别是,我想制作一个带有一个或两个标题(功能有限)的包装器DLL,我可以轻松地移动它。我会写一些我做过的事情的摘要;根据我们的需求量身定制,但也许你找到了有用的东西。

  • 我将--config=monolithic传递给bazel build命令(除了您需要的任何其他选项)。这将避免模块化库,从而消除对libtensorflow_framework.so的依赖(参见 tools/bazel.rc)。
  • 我构建的目标不是TensorFlow存储库中的任何目标。相反,我添加了一个非常小的程序,它使用我的包装器作为新的Bazel目标(C ++文件加上我的标题头和BUILD文件)。因此,为了编译这个最终的虚拟程序,必须事先编译所有的TensorFlow。
  • 当我完成这项工作后,我利用了Bazel已经将每个子目标编译为静态库的事实。我检查为我的虚拟程序目标生成的bazel-bin目录下的文件,名称以.params结尾 - 在那里我找到了用于编译它的所有静态库的路径。
  • 我将所有这些中间静态库复制到其他地方。另外,我复制了一堆头文件,我需要编译我的最终包装器(TensorFlow自己的,现在也是Eigen,Protobuf和Nsync)。我将所有这些都放在我之前准备的构建区域中。
  • 我使用NMake Makefile生成我的自定义DLL,使用静态库,复制的标头和我自己的瘦包装器。

这就是它,我想。我有一个丑陋的Bash脚本我在MSYS2上运行,它为我做了一切。通常在每个新版本中我都需要调整一两件事(configure脚本中的一些选项,我需要复制的一些额外标题等),但我最终会让它工作。虽然这很麻烦,所以我不一定说你应该使用相同的方法(但如果你愿意,可以随意询问有关任何步骤的细节)。

答案 1 :(得分:0)

使用提到的-2.params文件@jdehesa和详细的bazel输出(-s开关),您甚至可以创建一个link命令来最终静态链接这些中间静态库。我针对Windows / Linux / macOS自动化了此过程,并将其包含在vcpkg软件包管理器中。要使用它,只需运行vcpkg install tensorflow:x64-windows-static。如果您对来源感兴趣,则会找到它们here