tensorflow学习笔记2:c++程序静态链接tensorflow库加载模型文件

首先需要搞定tensorflow c++库,搜了一遍没有找到现成的包,于是下载tensorflow的源码开始编译;

tensorflow的contrib中有一个makefile项目,极大的简化的接下来的工作;

按照tensorflow makefile的说明文档,开始做c++库的编译:

 

1. 下载依赖

在tensorflow的项目顶层运行:

1
tensorflow/contrib/makefile/download_dependencies.sh

东西会下载到tensorflow/contrib/makefile/downloads/目录里;

 

2. 在linux下进行编译

首先确保编译工具都已经装好了:

1
sudo apt-get install autoconf automake libtool curl make g++ unzip zlib1g-dev git python

然后运行编译脚本;

注意:运行之前打开看一眼,第一步竟然是把tensorflow/contrib/makefile/downloads/目录里的东西清空然后重新下载。。。注掉注掉

1
tensorflow/contrib/makefile/build_all_linux.sh

然后在tensorflow/contrib/makefile/gen/lib/libtensorflow-core.a就看到静态库了;

 

3. 准备好加载模型的c++代码

保存成load_graph.cc;

 

写Makefile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
TARGET_NAME := load_graph
 
TENSORFLOW_MAKEFILE_DIR := /mnt/data/tensorflow/tensorflow/contrib/makefile
 
INCLUDES := \
-I /usr/local/lib/python3.6/dist-packages/tensorflow/include
 
NSYNC_LIB := \
$(TENSORFLOW_MAKEFILE_DIR)/downloads/nsync/builds/default.linux.c++11/nsync.a
 
PROTOBUF_LIB := \
$(TENSORFLOW_MAKEFILE_DIR)/gen/protobuf/lib/libprotobuf.a
 
TENSORFLOW_CORE_LIB := \
-Wl,--whole-archive $(TENSORFLOW_MAKEFILE_DIR)/gen/lib/libtensorflow-core.a -Wl,--no-whole-archive
 
LIBS := \
$(TENSORFLOW_CORE_LIB) \
$(NSYNC_LIB) \
$(PROTOBUF_LIB) \
-lpthread \
-ldl
 
SOURCES := \
load_graph.cc
 
$(TARGET_NAME):
    g++ -std=c++11 $(SOURCES) $(INCLUDES) -o $(TARGET_NAME) $(LIBS)
 
clean:
    rm $(TARGET_NAME)

这里的tensorflow-core、nsync和protobuf全都用静态链接了,这些静态库以后考虑都放一份到系统目录下;

 

有几个点需要注意:

1) INCLUDE使用了python3.6的带的tensorflow头文件,只是觉得反正python都已经带头文件了,就不需要再另外拷一份头文件进系统目录了;

2) nsync库是多平台的,因而可能需要仔细分析一下nsync的编译结果所在位置,尤其如果是交叉编译的话;

3) 链接顺序不能错,tensorflow-core肯定要在其它两个前面;

4) tensorflow_core库需要全链接进来,否则会出现这个错:tensorflow/core/common_runtime/session.cc:69] Not found: No session factory registered for the given session options: {target: "" config: } Registered factories are {}.

    想想也大概能知道为什么,肯定是在静态代码层面只依赖父类,然后再在运行时通过名字找子类,所以在符号层面是不直接依赖子类的,不强制whole-archive的话,子类一个都带不进来;

 

4. 运行程序

运行前先看看事先准备好的graph在不在预定位置,生成graph的方法见上一篇;

运行一下,没啥好说的,结果正确。

 

参考:

http://blog.163.com/wujiaxing009@126/blog/static/7198839920174125748893/

https://blog.csdn.net/xinchen1234/article/details/78750079

posted @   ZisZ  阅读(3931)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
· 用 DeepSeek 给对象做个网站,她一定感动坏了
· .NET 8.0 + Linux 香橙派,实现高效的 IoT 数据采集与控制解决方案
· .NET中 泛型 + 依赖注入 的实现与应用
点击右上角即可分享
微信分享提示