【问题标题】:Building Tensorflow 1.4.0 from sources for C/C++ in Ubuntu 17.10在 Ubuntu 17.10 中从 C/C++ 的源代码构建 Tensorflow 1.4.0
【发布时间】:2018-04-28 03:37:41
【问题描述】:

我正在尝试从 64 位 Ubuntu 17.10 中的 C/C++ 源代码构建 Tensorflow 1.4.0。我尝试使用 Bazel 遵循Tensorflow websiteother website for C++ 中的说明并将它们总结如下:

cd tensorflow
./configure
(select N for all the options)
bazel build --config=opt --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" --local_resources 2048,.5,1.0 //tensorflow:libtensorflow_cc.so //tensorflow:libtensorflow_framework.so //tensorflow/tools/pip_package:build_pip_package
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
sudo -H pip3 install /tmp/tensorflow_pkg/tensorflow-1.4.0rc1-cp36-cp36m-linux_x86_64.whl

当我尝试构建一个简单的测试程序并在 Eclipse 中包含 tensorflow/core/public/session.h 时(包含路径设置为从 git 下载的 tensorflow 根文件夹),它抱怨几件事:

  1. device_attributes.pb.h 中缺少 Google 的 protobuf common.h(我无法使用 apt-get 安装 protobuf,因为它会抱怨版本太旧 - 低于 3.0 .0.4 签入 device_attributes.pb.h)。我下载了最新的 protobuf 并按照说明进行安装
  2. tensor.h 中缺少 Eigen3 的 Tensor 文件,其中 tensor.h 包含 [tensorflow 目录]/third_party/eigen3/unsupported/Eigen/CXX11/Tensor 中的 Tensor 文件 ,而 [tensorflow 目录]/third_party/eigen3/unsupported/Eigen/CXX11/Tensor 包括缺少的 [/usr/include/eigen3/]unsupported/Eigen/CXX11/Tensor > libeigen3-dev 提供的文件。我 apt-get 安装 libeigen3-dev。
  3. 安装 libeigen3-dev 后,我将 /usr/include/eigen3 添加到 Eclipse 的包含路径中,因为 tensorflow 目录中的 Tensor 文件无法在 /usr 中找到 Tensor 文件/include(带有额外的 eigen3 目录)。
  4. mutex.h 中缺少 nsync_cv.h 文件。我将 tensorflow 目录中的 nsync 文件夹添加到包含路径中。

综上所述,我在 Eclipse 的包含路径中添加了以下路径:

  • [张量流目录]/
  • [tensorflow 目录]/bazel-genfiles
  • [tensorflow目录]/bazel-tensorflow/external/nsync/public
  • /usr/include/eigen3

我在库路径[tensorflow目录]/bazel-bin/tensorflow中添加了以下库:

  • 张量流
  • tensorflow_cc
  • tensorflow_framework

我还在 Eclipse 的项目设置中添加了 -std=c++11 到 GCC C++ 编译器和 GCC C++ Linker。最后它遇到了链接器错误:

[tensorflow directory]/tensorflow/core/platform/default/logging.h:187: undefined reference to `tensorflow::internal::CheckOpMessageBuilder::NewString[abi::cxx11]()'

我看到thread 讨论了类似的问题,但我确实设置了-D_GLIBCXX_USE_CXX11_ABI=0 并且 Ubuntu 17.10 使用的是 gcc5 或更高版本。

请建议如何修复链接器错误。非常感谢!

【问题讨论】:

    标签: c++ eclipse c++11 ubuntu tensorflow


    【解决方案1】:

    正式来说,你必须在 tensorflow sourcetree 中创建你的 C++ 项目,编写 BUILD 文件并使用 bazel 编译它。看this

    我写了一篇博文:https://tuanphuc.github.io/standalone-tensorflow-cpp/ 详细说明了如何使用配置制作独立的 C++ Tensorflow: - Ubuntu 17.10 - gcc 7.2.0 - tensorflow 1.4.0 - Python 2 or 3 - cmake 3.9.6 - Eigen 3.3.4 - Protobuf (master branch) - Googletest (master branch) - bazel 希望对你有帮助

    参考资料:

    Packaged TensorFlow C++ library for bazel-independent use

    graph.pb.h missing

    【讨论】:

    • 我做了一些调整以便能够编译它(例如 Makefile 添加 /usr/include/eigen3 和 ltensorflow_framework,使用 configure/make/make install 安装最新的 protobuf)。不幸的是,我仍然遇到相同的链接器错误,即 tensorflow/core/platform/default/logging.h:187: undefined reference to `tensorflow::internal::CheckOpMessageBuilder::NewString[abi:cxx11]()'
    • 我克隆了 1.4.0 并完成了上述所有步骤,并且成功了。你是否正确复制了/libtensorflow_cc.so:cp -r $TENSORFLOW_DIR/bazel-bin/tensorflow/libtensorflow_cc.so ./lib/ 其实你不需要添加/usr/include/eigen3,因为它已经在include/third_party/ 中了。您使用哪个版本的 protobuf?我用的是 3.3.2
    • 我确实正确复制了 libtensorflow_cc.so。我试图搜索 Tensor 文件,它只有 1 个命中,位于 [tensorflow directory]/third_party/eigen3/unsupported/Eigen/CXX11/Tensor #include "unsupported/Eigen/CXX11/Tensor"。请您确认您在 tensorflow 目录中有两个 Tensor 文件吗?我在 master 分支中使用最新的 protobuf v3.4。
    • 我也只有一个张量
    • 非常感谢。顺便说一句,我发现链接器错误的罪魁祸首来自 bazel-build --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" 中的附加选项,这是 tensorflow 网站推荐的 gcc 5 或更高版本。如果我删除此选项,一切都会正常运行。
    【解决方案2】:

    如果您不想过多地修改您的环境,有两种非官方的选择。一种是使用 Floop 的 tensorflow_cc 项目编译 C++ API 并安装在您的系统上。另一种可能性是安装我的打包项目的releases 之一,用于Tensorflow 的C 和C++ API。这两个项目都使用 CMake(而不是 Bazel)来支持源文件的 C++ 编译。

    从 Tensorflow 的角度来看,tensorflow_cc 的优势在于您可以根据需要构建 GPU 支持,而我的项目只能使用 CPU 进行推理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-09
      相关资源
      最近更新 更多