我正试图在C++应用程序中使用tensorflow作为外部库(主要遵循本教程)。到目前为止我做了什么:
- 我已经克隆了tensorflow repory(假设repo根目录是
$TENSORFLOW
) - 运行
/.configure
(所有设置都是默认设置,因此没有CUDA,没有OpenCL等) - 与
bazel build -c /opt //tensorflow:libtensorflow_cc.so
构建共享库(成功完成构建) -
现在我正在尝试
#include "tensorflow/core/public/session.h"
。但在包含它之后(并添加$TENSORFLOW
和$TENSORFLOW/bazel-genfiles
以包含路径),我收到错误:$TENSORFLOW/tensorflow/third_party/eigen3/unsupported/Eigen/CXX11/Tensor:1:42: fatal error: unsupported/Eigen/CXX11/Tensor: No such file or directory
有一个针对类似问题创建的github问题,但它被标记为已关闭,没有提供任何解决方案。我还尝试了master
分支以及v.1.4.0
发布。
你知道吗,是什么导致了这种问题,以及如何处理?
我(和许多其他人)为同样的问题而苦恼。它可能可以用bazel解决,但我对这个工具还不够了解,现在我用make解决了这个问题。混淆的来源是包含了一个名为Tensor的文件,而它本身也包含了一份名为Tensor的文件。这导致一些人错误地认为Tensor包含了它自己。
如果你构建并安装了python.whl文件,dist包中会有一个tensorflow目录,下面有一个include目录,例如在我的系统上:
/usr/local/lib/python2.7/dist-packages/tensorflow/include
从包含目录
find . -type f -name 'Tensor' -print
./third_party/eigen3/unsupported/Eigen/CXX11/Tensor
./external/eigen_archive/unsupported/Eigen/CXX11/Tensor
第一个有
#include "unsupported/Eigen/CXX11/Tensor"
并且应该满足这一点的文件是第二个。
因此,要编译包含session.h的session.cc,以下操作将适用于
INC_TENS1=/usr/local/lib/python2.7/dist-packages/tensorflow/include/
INC_TENS2=${INC_TENS1}external/eigen_archive/
gcc -c -std=c++11 -I $INC_TENS1 -I $INC_TENS2 session.cc
我看到过这样的说法:你必须从tensorflow树构建应用程序,并且必须使用bazel。然而,我相信你需要的所有头文件都在distpackages/tensorflow/include中,至少对于初学者来说,你可以构建makefile或cmake项目。
有点偏离主题,但我在一个使用opencv-4.5.5并使用Visual Studio编译的C++项目中遇到了同样的错误(opencv-4.3.0没有问题,MinGW也没有问题)。
为了使它发挥作用,我必须将CMakeLists.txt
:添加到我的根目录中
add_definitions(-DOPENCV_DISABLE_EIGEN_TENSOR_SUPPORT)
如果这能帮助到某人。。。
问题实际上是Tensor文件中头文件的相对路径。
Tensor的安装路径是/usr/include/igenu3/unsupported/Egent/CXX11/Tensor
但在张量文件中提到的是"不受支持的/Egengin/CX11/Tensor">
因此,在项目路径中应该有一个高达/usr/include/igent3/的条目来正确运行它,以便可以使用它。