具有共享库(libtensorflow_cc.so)的C ++编译项目失败

时间:2018-08-22 11:23:07

标签: c++ tensorflow

目前,在Tensorflow的支持下,编译(和运行)(大型)自己的项目时遇到了一些问题。在我自己的系统(Ubuntu 16.04 LTS)上,一切正常。在群集上执行相同的步骤会导致编译错误,但我现在还找不到解决方案。

系统信息

  • 我是否已编写自定义代码:是
  • OS平台和发行版(例如Linux Ubuntu 16.04):CentOS 7.4.1708
  • 从(源或二进制)安装的TensorFlow :源(使用git repo)
  • TensorFlow版本(使用下面的命令):1.9
  • Python版本:2.7.15
  • Bazel版本(如果从源代码编译):0.16
  • GCC /编译器版本(如果从源代码编译):7.30
  • CUDA / cuDNN版本:未使用
  • GPU模型和内存:Tesla K20m
  • 用于复制的精确命令

    1. github上的克隆tensorflow回购
    2. 配置Bazel (./在tensorflow存储库中配置)
    3. 用淡褐色构建libtensorflow_cc.so (工作正常!!)
    4. 使用提供的脚本 tensorflow / contrib / makefile / download_dependencies.sh 下载的依赖项 (也尝试手动安装protobuf和eigen)!
    5. 使用./autogen.sh && ./configure && make && make install
    6. 安装 protobuf
    7. 从下载的依赖项中安装了Eigen
    8. 复制的库,标头并包含在自己的项目中:

      $ cp bazel-bin/tensorflow/libtensorflow_cc.so ../tf_project/lib/
      $ cp bazel-bin/tensorflow/libtensorflow_framework.so ../tf_project/lib/
      $ cp /tmp/proto/lib/libprotobuf.a ../tf_project/lib/
      $ mkdir -p ../tf_project/include/tensorflow
      $ cp -r bazel-genfiles/ * ../tf_project/include/
      $ cp -r tensorflow/cc ../tf_project/include/tensorflow
      $ cp -r tensorflow/core ../tf_project/include/tensorflow
      $ cp -r third_party ../tf_project/include
      $ cp -r /tmp/proto/include/ * ../tf_project/include
      $ cp -r /tmp/eigen/include/eigen3/ * ../tf_project/include
      

注释:在我自己的系统上,这种方法已经运行了几周。我可以在自己的项目中使用tensorflow,并在python项目中使用由keras训练的导出模型。我使用client_sessions和tensorflow框架的许多其他功能进行预测,并且可以正常工作。

问题::在集群上,我可以将张量流编译为动态库,安装protobuf和eigen。 当我尝试编译我的项目(关于我自己的系统的类似过程)而没有重大更改时,它不起作用并停止并显示以下错误消息:

.../tensorflow/include/tensorflow/core/framework/tensor.pb.h:12:2: error: #error This file was generated by a newer version of protoc which is
 #error This file was generated by a newer version of protoc which is
  ^~~~~
.../include/tensorflow/core/framework/tensor.pb.h:13:2: error: #error incompatible with your Protocol Buffer headers. Please update
 #error incompatible with your Protocol Buffer headers.  Please update
  ^~~~~
.../include/tensorflow/core/framework/tensor.pb.h:14:2: error: #error your headers.
 #error your headers.
  ^~~~~
.../include/tensorflow/core/framework/tensor.pb.h:27:10: fatal error: google/protobuf/inlined_string_field.h: No such file or directory
 #include <google/protobuf/inlined_string_field.h>
          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

因此,显然这应该是问题所在

此文件是由与协议缓冲区标头不兼容的较新版本的protoc生成的。请更新标题。

严重错误: google / protobuf / inlined_string_field.h:没有此类文件或目录

尝试过的解决方案:

  1. 我尝试了不同版本的 protobuf ,但是每次尝试都出错。
  2. 我尝试手动安装 protobuf 特征(没有download_dependencies.sh脚本)

我想知道,因为按照相同的步骤进行我自己的安装可以正常工作。除非我尝试使用不同版本以确保这些不是“新”问题,否则其中一个组件可能存在问题。

有人可以帮助我解决我可以在另一台计算机上编译并运行该项目的错误吗?

期待获得有用的解决方案:)非常感谢您的支持!

德国最诚挚的问候!

2 个答案:

答案 0 :(得分:1)

首先,我在github上进行了检查,tensorflow r1.9需要protobuf> = 3.6.0。使用download_dependencies.sh脚本,您总会得到protobuf 3.5.0,其中缺少inlined_string_field.h和其他一些头文件。

第二,一些错误要求您更新protobuf版本。我也尝试了许多版本的protobuf。只有3.6.0版才能正常运行,而不是3.6.1版或更早的版本。

对于这些错误,

  

error此文件是由protoc的较新版本生成的

     

严重错误:google / protobuf / inlined_string_field.h:无此类文件或目录

这是版本不匹配的问题。我的解决方案是从以下位置手动下载protobuf 3.6.0 https://github.com/protocolbuffers/protobuf/releases/download/v3.6.0/protoc-3.6.0-linux-x86_64.zip

安装并cp /usr/local/include/google to somewhere/tf/include。对我来说效果很好。我不知道您是否尝试过3.6.0版。

  

download_dependencies.sh脚本将提供不匹配的版本   原虫。查看我在github上发布的问题   https://github.com/tensorflow/tensorflow/issues/22536

此外,我注意到您复制的文件与我的不同。我是这样做的。

sudo mkdir /usr/local/tensorflow/include
sudo cp -r tensorflow/contrib/makefile/downloads/eigen/Eigen /usr/local/tensorflow/include/
sudo cp -r tensorflow/contrib/makefile/downloads/eigen/unsupported /usr/local/tensorflow/include/
sudo cp -r tensorflow/contrib/makefile/gen/protobuf/include/google /usr/local/tensorflow/include/
sudo cp tensorflow/contrib/makefile/downloads/nsync/public/* /usr/local/tensorflow/include/
sudo cp -r bazel-genfiles/tensorflow /usr/local/tensorflow/include/
sudo cp -r tensorflow/cc /usr/local/tensorflow/include/tensorflow
sudo cp -r tensorflow/core /usr/local/tensorflow/include/tensorflow
sudo mkdir /usr/local/tensorflow/include/third_party
sudo cp -r third_party/eigen3 /usr/local/tensorflow/include/third_party/
sudo mkdir /usr/local/tensorflow/lib
sudo cp bazel-bin/tensorflow/libtensorflow_*.so /usr/local/tensorflow/lib

顺便说一句,我运行的是build_all_linux.sh而不是download_dependencies.sh。

希望对您有所帮助。

答案 1 :(得分:0)

我之前遇到过这个问题,下面是我的解决方法:

我成功地用tensorflow-r1.8构建了bazel。我发现以下路径中的protoc是3.5.0:

/home/zsb/.cache/bazel/_bazel_zsb/1372f28eb0671f692e7ac38330377d8c/execroot/org_tensorflow/bazel-out/host/bin/external/protobuf_archive/protoc --version

但是实际上我的系统配置使用的是protoc版本3.4.0 我直接通过类型"protoc --version"确认了这一点。

所以最后我将系统protobuffer的版本更新为3.5.0,此问题已解决。