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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」