在使用TensorFlow时,出现了"unsupported/Eigen/CXX11/Tensor: No such file or directory"的错误提示。

7

我正在尝试在我的C++应用程序中使用TensorFlow作为外部库(主要是遵循这个教程)。到目前为止,我已经完成了以下工作:

  1. I have cloned the tensorflow reporitory (let's say, that the repo root dir is $TENSORFLOW)
  2. Run /.configure (which all settings default, so no CUDA, no OpenCL etc.).
  3. Build shared library with bazel build -c /opt //tensorflow:libtensorflow_cc.so (build completed successfully)
  4. Now I'm trying to #include "tensorflow/core/public/session.h". But after including it (and adding $TENSORFLOW and $TENSORFLOW/bazel-genfiles to include path), I'm receiving error:

    $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版本。

你知道可能是什么原因导致这种问题,以及如何处理它吗?


提问得很好;这也可能是TensorFlow 1.12(我怀疑几乎每个版本)的一个问题。 - syntheticgio
4个回答

5

我(以及许多其他人)都在苦恼同样的问题。这个问题可能可以使用bazel解决,但我不太了解这个工具,现在我使用make来解决这个问题。混淆的源头是一个名为Tensor的文件被包含,它本身包含一个名为Tensor的文件,这导致一些人错误地得出Tensor正在包含自身的结论。

如果您构建并安装了python .whl文件,则会在dist-packages中有一个tensorflow目录,并且其中有一个include目录,例如在我的系统上:

/usr/local/lib/python2.7/dist-packages/tensorflow/include

从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。然而,我认为你所需要的所有头文件都在dist-packages/tensorflow/include中,至少对于初学者来说,你可以构建makefile或cmake项目。


这在使用g++时完美运行,但是当添加到cmake中时,相同的路径会抛出一个错误/usr/local/include/google/tensorflow/third_party/eigen3/unsupported/Eigen/CXX11/Tensor:1:10: fatal error: 'unsupported/Eigen/CXX11/Tensor' file not found #include "unsupported/Eigen/CXX11/Tensor" 你有没有尝试过在cmake中使用它? - Isabela
这对我在tensorflow 1.12上有效;尽管我的include目录在别的地方(取决于它的安装方式)。同意答案,这似乎假定您正在使用bazel构建项目,但我也没有专业知识,并且一直遇到问题,使其变得困难。我会假设用于tensorflow的cmake find package会报告这些include目录? - syntheticgio

2
略微离题,但我在使用opencv-4.5.5和Visual Studio编译的C++项目中遇到了同样的错误(使用opencv-4.3.0和MinGW没有问题)。
为了使其正常工作,我不得不在我的根目录下添加以下代码到CMakeLists.txt文件中:
add_definitions(-DOPENCV_DISABLE_EIGEN_TENSOR_SUPPORT)

如果这能帮助某人...

1
问题实际上在于Tensor文件中引用的头文件相对路径不正确。
Tensor的安装路径为/usr/include/eigen3/unsupported/Eigen/CXX11/Tensor。
但是在Tensor文件中提到的是"unsupported/Eigen/CXX11/Tensor"。
因此,在项目路径中应该有一个条目,直到/usr/include/eigen3/,以便正确运行并使用它。

这可能会导致它尝试包含自身;令人困惑的是,实际上还有另一个Tensor.h文件(命名不当)在别处。 - syntheticgio
这帮助了我很多。 - Las Des

0

复制它以便于搜索

sudo cp -r /usr/include/eigen3/Eigen /usr/include &&
sudo cp -r /usr/include/eigen3/signature_of_eigen3_matrix_library /usr/include &&
sudo cp -r /usr/include/eigen3/unsupported /usr/include

您的回答可以通过提供更多支持性信息来改进。请[编辑]以添加更多细节,比如引用或文献,以便他人可以确认您的回答是否正确。您可以在帮助中心找到更多关于如何撰写好答案的信息。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接