使用共享对象 (libtensorflow_cc.so) 的 C++ 编译项目失败
Posted
技术标签:
【中文标题】使用共享对象 (libtensorflow_cc.so) 的 C++ 编译项目失败【英文标题】:C++ compiling project with shared object (libtensorflow_cc.so) failed 【发布时间】:2018-08-22 11:23:06 【问题描述】:目前,在 Tensorflow 的支持下,我在编译(和运行)一个(巨大的)自己的项目时遇到了一些问题。在我自己的系统(Ubuntu 16.04 LTS)上一切正常。集群上的相同过程会导致编译错误,我还没有找到解决方案。
系统信息
我是否编写了自定义代码:是 操作系统平台和发行版(例如,Linux Ubuntu 16.04):CentOS 7.4.1708 TensorFlow 安装自(源代码或二进制文件):源代码(使用 git 存储库) TensorFlow 版本(使用下面的命令):1.9 Python 版本:2.7.15 Bazel 版本(如果从源代码编译):0.16 GCC/编译器版本(如果从源代码编译):7.30 CUDA/cuDNN 版本:未使用 GPU 型号和内存:Tesla K20m复制的精确命令:
-
从 github 克隆的 tensorflow 存储库
配置 Bazel (张量流 repo 中的 ./configure)
使用 bazel 构建 libtensorflow_cc.so (工作正常!!!)
使用交付的脚本下载依赖项tensorflow/contrib/makefile/download_dependencies.sh
(也尝试手动安装 protobuf 和 eigen)!
使用 ./autogen.sh && ./configure && make && make install 安装了 protobuf
从下载的依赖项中安装 Eigen
将库、标头和包含复制到自己的项目中:
$ 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 框架的许多其他功能进行预测,并且可以正常工作。
问题: 在集群中我可以将 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 生成,该版本与您的 Protocol Buffer 标头不兼容。请更新您的标题。
和
致命错误: google/protobuf/inlined_string_field.h:没有这样的文件或目录
尝试过的解决方案:
-
我尝试了不同版本的 protobuf,但每次尝试都会出错。
我尝试手动安装 protobuf 和 eigen(没有 download_dependencies.sh 脚本)
我想知道,因为我自己的安装遵循完全相同的步骤可以正常工作。除非我尝试了不同的版本以确保这些不是“新”问题,否则其中一个组件可能存在问题。
谁能帮我解决这个错误,我可以在另一台机器上编译和运行这个项目?
期待获得有用的解决方案:) 非常感谢您的支持!
来自德国的问候!
【问题讨论】:
我可能是即使你已经安装了 protobuf 系统正在从另一个地方获取它。检查您的PATH
以查看它正在使用哪个 protobuf。
感谢您的评论。不幸的是,这个系统中只有一个 protobuf 安装。那就是我在第 5 步之后安装的!
【参考方案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 或更早版本。
对于这些错误,
错误此文件是由较新版本的 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 脚本会提供不匹配的版本 protobuf。查看我在 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。
希望对您有所帮助。
【讨论】:
谢谢!我还需要复制sudo cp -r tensorflow/contrib/makefile/downloads/absl /usr/local/tensorflow/include
【参考方案2】:
我之前遇到过这个问题,以下是我的解决方案:
我用bazel
成功构建了tensorflow-r1.8
。我在以下路径中发现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
并修复了这个问题。
【讨论】:
以上是关于使用共享对象 (libtensorflow_cc.so) 的 C++ 编译项目失败的主要内容,如果未能解决你的问题,请参考以下文章