参考文献

https://blog.csdn.net/asialee_bird/article/details/100990483

https://www.jianshu.com/p/7f6b8a290f81

前言

因为服务器网速的原因,无法使用下载tensorflow源码,即通过官网方法

git clone https://github.com/tensorflow/tensorflow.git
cd tensorflow

下载的tensorflow源码默认是master里面的代码,想要编译tensorflow其他版本的话,需要使用

git checkout branch_name  # r1.9, r1.10, etc. 

然后想到的就是直接下载固定的tensorflow的版本,然后将其传到服务器中进行编译。其中固定版本tensorflow下载地址,有的tensorflow版本下载完成以后才几兆B,这样子的源文件是编译不了的(缺少文件),下面tensorflow1.13是30多兆,是可以编译成功的。

服务器的环境

说下运行环境,

Ubuntu18.04,

python3.7

CUDA 10.0,

cuDNN 7.6.3

查看cuda和cudnn版本

nvcc -V
cat /usr/local/cuda/include/cudnn.h | grep CUDNN_MAJOR -A 2

1、软件下载

(1)tensorflow-1.13.1源码(tensorflow 1.13.1)

(2)bazel-0.19.2-installer-linux-x86_64.sh(bazel-0.19.2-installer-linux-x86_64.sh)

(4)protobuf-3.6.1.2.tar.gz

将这些文件传到百度云里面

链接:https://pan.baidu.com/s/1wIX9u_mNVgDo8RydT7sNIA 
提取码:yt5x

期间也尝试了很多东西,下面是一些下载的文件

链接:https://pan.baidu.com/s/1hOiY_ClmPAnT1s1totjg8Q 
提取码:ozc1

2、Bazel编译器的安装

bazel编译器和tensorflow版本必须匹配,不然无法编译,可以去参考官网给的资料

bazel编译器我直接安装到我自己用户目录下(如:/home/zyt5/)了,没有安装在根目录下

chmod +x bazel-0.19.2-installer-linux-x86_64.sh
./bazel-0.19.2-installer-linux-x86_64.sh --user

安装完成之后,还需要在bashrc里面添加环境变量

vim ~/.bashrc

然后键入

export PATH="$PATH:$HOME/bin"

保存后使其生效,输入指令

source ~/.bashrc

可以查看bazel版本

bazel version

3、安装protobuf

安装Protobuf有一点很重要,要与所编译的tensorflow版本相对应,这个可以参考官网

解压文件

tar zxvf protobuf-3.6.1.2.tar.gz 

然后新建一个编译完成的文件夹

mkdir protobuf_bin

下载好后进入protobuf-3.6.1.2目录输入以下命令安装

cd protobuf-3.6.1.2/
./autogen.sh

如果出现

./autogen.sh: 32: ./autogen.sh: autoreconf: not found

请管理员执行

sudo apt-get install autoconf automake libtool

在protobuf-3.6.1.2目录下执行

./configure --prefix=$HOME/protobuf_bin (自己新建的目录)
make -j4
make install 

编译好后添加环境变量(根据自己的安装路径来)

vim ~/.bashrc

export PATH=$PATH:$HOME/tools/protobuf_bin/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/tools/protobuf_bin/lib
export CPLUS_INCLUDE_PATH="/home/zhouxd/tools/protobuf_bin/include"

source ~/.bashrc

查看版本以验证安装

 protoc --version

如果想要卸载protobuf

cd protobuf-3.6.1.2/
make uninstall

4、tensorflow源码编译

tar zxvf tensorflow-1.13.1.tar.gz
cd tensorflow-1.13.1/
./configure

按照下面图片的方式执行,只要CUDA support选择Y,其他基本上都是默认和N,其中默认是10.0,如果不是在后面写上对应的版本,我cudnn是7.6.3,默认是7,直接默认也是OK的。

设置完成之后需要编译了

// 有显卡
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so
// 无显卡
bazel build --config=opt //tensorflow:libtensorflow_cc.so

注意:部分博主说没有使用--config=monolithic,会出现opencv无法使用 ,我没有添加但是依旧可以

这个需要一段时间才能安装完成,期间可能会报错,因为在bazel编译tensorflow源码还需要其他依赖项,因为网速的原因无法下载完全故会报错,没什么解决办法,重新编译(即上面的bazel指令),直到成功。(期间试过将这些依赖项下载完成放在需要的位置上,但是还是会下载的,还是需要重新编译)

ERROR: error loading package '': Encountered error while reading extension file 'container/container.bzl': no such package '@io_bazel_rules_docker//container': java.io.IOException: Error downloading [https://github.com/bazelbuild/rules_docker/archive/a9bb1dab84cdf46e34d1b34b53a17bda129b5eba.tar.gz] to /home/zyt5/.cache/bazel/_bazel_zyt5/957c869dd334b8c29712fd21f3584066/external/io_bazel_rules_docker/a9bb1dab84cdf46e34d1b34b53a17bda129b5eba.tar.gz: Tried to reconnect at offset 403,461 but server didn't support it

编译成功后,tensorflow-1.13.1目录下会出现 bazel-xxx 的几个文件,在tensorflow-1.13.1/bazel-bin/tensorflow文件下会出现 libtensorflow_cc.so 和 libtensorflow_framework.so 动态库文件

编译安装其他依赖项

cd ~/tensorflow-1.13.1/tensorflow/contrib/makefile/
./build_all_linux.sh

注意:build_all_linux.sh这个命令是包含./download_dependencies.sh,但是单独执行./download_dependencies.sh这个命令不成功

执行成功后,在tensorflow-1.13.1/tensorflow/contrib/makefile目录下:downloads文件夹下存放第三方依赖的一些头文件和静态库,比如absl  cub  double_conversion  eigen  fft2d  gemmlowp  googletest  nsync  re2。这些第三方库是可以自己安装的,可以去参考:https://www.jianshu.com/p/7f6b8a290f81

Eigen3需要进行编译才能使用

首先打开上一步的downloads文件夹,里面会有个eigen文件夹,进入eigen文件夹打开终端依次输入如下指令:

mkdir build
cd build
cmake ..
make
sudo make install

安装完毕后,在usr/local/include目录下会出现eigen3文件夹。这个先安装在了根目录下了,最好安装自己的用户目录下

说明:Eigen 是一个高层次的C ++库,有效支持线性代数,矩阵和矢量运算,数值分析及其相关的算法;Protocol Buffers (简称 Protobuf)是 Google 开源的一款跨语言,跨平台,扩展性好的序列化工具,相比于 XML 和 JSON 等流行的编码格式,这种数据结构化语言需要使用protoc进行编译。

5、测试tensorflow C++API

在自己的目录下新建一个cpptest文件夹,文件夹的目录如下:

对于main.cpp文件,里面的内容如下:

#include <tensorflow/core/platform/env.h>
#include <tensorflow/core/public/session.h>
#include <iostream>using namespace std;
using namespace tensorflow;int main()
{Session* session;Status status = NewSession(SessionOptions(), &session);if (!status.ok()) {cout << status.ToString() << "\n";return 1;}cout << "Session successfully created.\n";
}

其中CMakeLists.txt文件如下

#指定 cmake 的最小版本
cmake_minimum_required(VERSION 3.10.2)
#项目名称/工程名
project(cpptest)
#设置c++编译器
set(CMAKE_CXX_STANDARD 14)#aux_source_directory(./src DIR_SRCS)  # 搜索当前目录下的所有.cpp文件  #设置TENSORFLOW_DIR变量,变量内容为安装的tensorflow文件夹路径
set(TENSORFLOW_DIR /home/zyt5/tensorflow-1.13.1)
include_directories(${TENSORFLOW_DIR}${TENSORFLOW_DIR}/bazel-genfiles${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/absl${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/nsync/public/usr/local/include/eigen3/home/zyt5/protobuf_bin/include)  link_directories(${TENSORFLOW_DIR} /home/zyt5/tensorflow-1.13.1/bazel-bin/tensorflow)  #动态链接库目录
#add_executable(cpptest ${DIR_SRCS})    ## 生成可执行文件
add_executable(cpptest main) #添加可执行文件所需要的库,连接libtensorflow_cc.so和libtensorflow_framework库,链接动态链接库
target_link_libraries(cpptest tensorflow_cc tensorflow_framework)

编译和运行

mkdir build   #创建build文件,是为了将编译程序放到build文件中
cd build
cmake ..   #使用cmake构建生成make文件
make       #使用make编译
./cpptest    #运行可执行文件

运行结果如下,说明tensorflow编译结束

Linux下tensorflow1.13.1 C++ API的编译和使用相关推荐

  1. mysql5.5.8编译安装_Mysql应用linux下mysql 5.5.8 源码编译安装

    <MysqL应用linux下MysqL 5.5.8 源码编译安装>要点: 本文介绍了MysqL应用linux下MysqL 5.5.8 源码编译安装,希望对您有用.如果有疑问,可以联系我们. ...

  2. linux下下载openwrt源码,OpenWrt下载编译

    不想啰嗦直接肝,依次执行: git clone git://github.com/openwrt/openwrt.git cd openwrt ./scripts/feeds update -a ./ ...

  3. linux下生成guid,在Linux下生成GUID的程序,及编译错误 “uuid/uuid.h: No such file or directory” 的解决办法。...

    在Linux下编写生成GUID的程序,如下 guid.c 文件: #include #include void uuid2string(const uuid_t uu, char* const str ...

  4. Linux下静态库和动态库的编译连接

    http://blog.sina.com.cn/s/blog_4090ba590100t3nu.html .a文件 gcc -c test.c  ar rc libtest.a test.o  ran ...

  5. Linux 应用程序 嵌汇编,Linux下嵌入汇编代码调用API(using fork())

    以下关于fork()的描述来自于:jason314 首先,在Linux环境下,一个进程调用fork()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间.然后把原来的进程的所有值都复制到新的新 ...

  6. mysql c api 函数 linux下 mysql_query_Linux C 调用MYSQL API 函数mysql_escape_string()转义插入数据...

    标签: Title:Linux C 调用MYSQL API 函数mysql_escape_string()转义插入数据 --2013-10-11 11:57 #include #include #in ...

  7. linux下RocketMQ的安装和API调用中出现的问题的解决 MARK一下

    下载和构建 配置环境变量 在/etc/profile最后添加 JAVA_HOME=/soft/jdk1.8.0_111 MAVEN_HOME=/soft/maven/apache-maven-3.5. ...

  8. 嵌入式linux alsa,嵌入式Linux下ALSA音频架构ALSA-lib移植与编译心得

    **************************************************************************************************** ...

  9. Linux编译程序源码环境,Linux下对nodejs环境进行源码编译并部署云应用

    Node 是一个让 JavaScript 运行在服务端的开发平台,它让 JavaScript 成为与PHP.Python.Perl.Ruby 等服务端语言平起平坐的脚本语言. 该环境安装非常简单,这里 ...

最新文章

  1. centos上传文件oracle,CentOS下启用Oracle ACFS步骤
  2. 成功解决TypeError: Cannot cast array data from dtype('float64') to dtype('U32') according to the rule '
  3. 开源的ESB产品列表信息
  4. octave绘制图片Figure后无法关闭
  5. 数据结构_排序算法总结
  6. mysql kill 超过1分钟的语句
  7. 初学者python笔记(hashlib加密、logging日志模块、configparser配置文件)
  8. 算法图解学习笔记02之选择排序
  9. 《Power Designer系统分析与建模实战》——1.4 本章小结
  10. js获取td的html,js中获取 table节点各tr及td的内容简单实例
  11. 【TWVRP】基于matlab灰狼算法求解带时间窗的路径规划问题【含Matlab源码 1075期】
  12. php 模拟微信登录,实例详解PHP实现微信模拟登陆并给用户发送消息
  13. Selenium自动化中无头浏览器的应用
  14. html页面banner空白,css banner不拉伸
  15. 解决Anaconda安装包时报错CondaVerificationError: The package for pytorch located at...
  16. vim java win
  17. 来篇鸡汤文吧,教你如何七周内从小菜鸟成长为一名合格的数据分析师
  18. 每日一题-59(查询活跃业务)
  19. Visitor模式与Acyclic Visitor
  20. 微信气泡主题设置_微信主题! 米老鼠微信主题气泡设置教程方法

热门文章

  1. EChart绘制风速风向曲线分析图
  2. 开启springboot中对jsp页面修改后的热部署
  3. 网络流20+4题解题报告(已更前20题)
  4. volatile关键字(转)
  5. C#中using关键字的作用及其用法(转)
  6. 【python】导入HTMLTestRunner失败---报错ModuleNotFoundError: No module named ‘HTMLTestRunner‘
  7. 组件注册@ComponentScan的自动扫描和指定扫描规则
  8. Servlet destroy()回收机制
  9. 测试用例-其他相关知识
  10. onsize里获取的对话框大小有时会包含滚动条_Python实战分析:获取数据