linux 下 tensorflow C++ 提取include文件、第一个hello world

在用C++ 调用tensorflow库时,发现tensorflow 官网没有介绍如何获取tensorflow库头文件,导致在调用tensorflow 库的时候遇见了很多问题。

如果还没有编译tensorflow库,可以看下:https://www.cnblogs.com/GengMingYan/p/15963832.html

tensorflow : tensorflow 1.15.4

gcc : gcc version 11.2.0

 

20220327:

  tensorflow 2.8.0 : 已测试当前最新tensorflow 2.8.0 版本,以下整理头文件过程同样适用。

  不过在有些开发工具中使用时要显示指定支持C++14特性,例如QT需要添加CONFIG += c++14

 

tensorflow "Hello World"

1. 首先,先附上最简单的代码,类似tensorflow 版 "Hello World"

#include <stdlib.h>
#include "tensorflow/core/public/session.h"

using namespace tensorflow;
using namespace std;
static Status ReadEntireFile(tensorflow::Env* env, const string& filename,
                             Tensor* output);
int main(int argc, char *argv[])
{
    SessionOptions sessionOptions;
    Session *session = NewSession(sessionOptions);


    return EXIT_SUCCESS;
}

最终编译命令:

g++ test.cpp -Iport_def -Ieigen_archive -L/opt/work/c_work/qt_work/tensorflow_cc_demo/lib2 -I. -ltensorflow_cc -ltensorflow_framework
/opt/work/c_work/qt_work/tensorflow_cc_demo/lib2 是我本机 tensorflow 库所在位置

整体过程

首先,需要先编译tensorflow,因为有很多需要用到的头文件是在编译后生成的,头文件生成在~/cache/bazel/文件夹下

项目使用tensorflow,就需要两个库: tensorflow_cc 和 tensorflow_framework

1. 从源代码中复制tensorflow/core到项目目录

2. 从源代码中复制third_party到项目目录

3. 从~/.cache/bazel/_bazel_root/中复制用到的各个头文件到项目目录 (比较繁琐的地方,不难,但需要费很大精力解决各种 文件不存在错误)

 

开始

1. 创建测试文件

创建一个文件夹,创建一个test.cpp文件。把上方tensorflow  的"hello world"内容复制到test.cpp中,像这样:

 

 

编译命令

g++ test.cpp -Iport_def -Ieigen_archive -L/opt/work/c_work/qt_work/tensorflow_cc_demo/lib2 -I. -ltensorflow_cc -ltensorflow_framework

 2. 复制源代码中的tensorflow/core和third_party文件夹

复制源代码中tensorflow/core文件夹和third_party文件夹到项目目录下

这时候如果执行命令编译,会报device_attributes.pb.h文件不存在:

In file included from test.cpp:2:
tensorflow/core/public/session.h:22:10: fatal error: tensorflow/core/framework/device_attributes.pb.h: 没有那个文件或目录
   22 | #include "tensorflow/core/framework/device_attributes.pb.h"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

 

3. device_attributes.pb.h

搜索device_attributes.pb.h文件,找到device_attributes.pb.h文件层级目录为tensorflow/core/framework/的结果:

 

 

把 device_attributes.pb.h文件所在目录framework文件夹和项目中tensorflow/core/下的framework文件夹合并

在编译,会报:

In file included from tensorflow/core/public/session.h:22,
                 from test.cpp:2:
./tensorflow/core/framework/device_attributes.pb.h:10:10: fatal error: google/protobuf/port_def.inc: 没有那个文件或目录
   10 | #include <google/protobuf/port_def.inc>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

 

4. port_def.inc

搜索port_def.inc文件,找到文件层级是google/prootobuf的目录:

 

 

项目路径下创建port_def目录,复制google到port_def路径下

在编译,报错:

In file included from ./tensorflow/core/framework/tensor.h:22,
                 from tensorflow/core/public/session.h:24,
                 from test.cpp:2:
./third_party/eigen3/unsupported/Eigen/CXX11/Tensor:1:10: fatal error: unsupported/Eigen/CXX11/Tensor: 没有那个文件或目录
    1 | #include "unsupported/Eigen/CXX11/Tensor"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

 

5. Tensor

全局搜索Tensor,找到层级目录eigen_archive/unsupported/Eigen/CXX11/下的Tensor文件。

 

 

 复制eigen_archive到项目目录下

在编译,报错:

In file included from ./tensorflow/core/framework/tensor.h:23,
                 from tensorflow/core/public/session.h:24,
                 from test.cpp:2:
./tensorflow/core/framework/allocator.h:24:10: fatal error: absl/strings/string_view.h: 没有那个文件或目录
   24 | #include "absl/strings/string_view.h"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

 

6. string_view.h

全局搜索string_view.h,找到层级目录absl/strings下的string_view.h文件:

 

 

 复制absl目录到项目目录下。

在编译,报错:

In file included from ./tensorflow/core/platform/errors.h:22,
                 from ./tensorflow/core/lib/core/errors.h:19,
                 from ./tensorflow/core/framework/tensor_shape.h:23,
                 from ./tensorflow/core/framework/tensor.h:24,
                 from tensorflow/core/public/session.h:24,
                 from test.cpp:2:
./tensorflow/core/platform/status.h:28:10: fatal error: tensorflow/core/protobuf/error_codes.pb.h: 没有那个文件或目录
   28 | #include "tensorflow/core/protobuf/error_codes.pb.h"
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

 

7. error_codes.pb.h

全局搜索error_codes.pb.h,找到层级目录tensorflow/core/protobuf下的error_codes.pb.h:

 

 

 复制protobuf目录下文件到项目目录tensorflow/core/protobuf下。

 

最后,编译成功。

 

已把整理好的1.15.4头文件放到: https://quqi.avyeld.com/s/6273754/gRyB9OxneCnE6PJY,当前最新2.8.0 头文件:https://quqi.avyeld.com/s/6273754/tsveTbwuta99APlt

如果在引入头文件过程中,用到一些第三方库没有,尽量从编译环境下找,不要去网上下载,大概率会有版本不对问题。

如果像获取已编译好的1.15.4、2.8.0库文件,去: https://www.cnblogs.com/GengMingYan/p/15963832.html

posted @ 2022-03-26 17:59  耿明岩  阅读(683)  评论(0编辑  收藏  举报
希望能帮助到你,顺利解决问题! ...G(^_−)☆