Linux下Tensorflow编译使用C++ API

版权声明:本文为博主原创文章,转载请注明出处:https://blog.csdn.net/qq_31261509 https://blog.csdn.net/qq_31261509/article/details/81666763

前言(废话)


最近需要调用c++接口的tensorflow,本来用了半天不到成功编译好了tensorflow,但实际调用Protobuf库时候出现 This file was generated by an older version of protoc which is 或者 This file was generated by an newer version of protoc which is 的错误,也就是说明tensorflow调用protobuf库版本太老了或者太新了,最后又用了挺长时间处理这个问题,感谢这篇博主的博客,让困惑我长达一上午的Probobuf版本不对应问题得到解决。并且感谢tensorflow c++接口编译tensorflow1.4 c+编译以及API使用这两篇博客给我以编译tensorflow以启发作用。最后通过这篇文章进行总结一下tensorflow c++ API的安装步骤。





tensorflow编译

博客主要介绍安装以及使用tensorflow的c++ api.


编译tensorflow源文件

  • 下载tensorflow并且配置编译:
#下载tensorflow
git clone https://github.com/tensorflow/tensorflow
#进入tensorflow文件夹下
cd tensorflow
#配置tensorflow安装选项
./configure

其中 ./configure 配置tensorflow的设置命令可运行也可不运行,然后通过bazel进行编译:(bazel需要自己安装)

#编译C++ API,生成.so文件,Tensorflow调用CUDA
bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so

#编译C++ API,生成.so文件,Tensorflow不调用CUDA
bazel build --config=opt //tensorflow:libtensorflow_cc.so

然后bazel-bin/tensorflow文件夹下会出现libtensorflow_cc.so以及libtensorflow_framework.so文件,需要在c++程序中调用tensorflow时,只需要将路径添加到库路径中。

编译第三方库文件

由于tensorflow需要用到第三方库文件比如Protobuf以及矩阵库Eigen等,我们应该使用官方给出调用的例子,可以避免tensorflow和第三方库版本不对应而产生的问题

进入tensorflow主目录
cd tensorflow
运行编译第三方库的脚本
cd tensorflow/contrib/makefile/build_all_linux.sh

执行成功后,在tensorflow/tensorflow/contrib/makefile目录下需要知道:

  • downloads存放第三方依赖的一些头文件和静态库,比如nsync、Eigen等

  • gen存放Tensorflow生成PB头文件、Tensorflow的静态库、ProtoBuf的头文件和静态库等等。





使用CMake构建tensorflow程序,测试c++ API是否成功安装


  • 创建一个demo文件夹并进入,创建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)
#项目名称
project(demo)
#设置c++编译器
set(CMAKE_CXX_STANDARD 11)
#设置TENSORFLOW_DIR变量,变量内容为安装的tensorflow文件夹路径
set(TENSORFLOW_DIR /home/rui/tensorflow-r1.5)
#项目中的include路径
include_directories(${TENSORFLOW_DIR})
include_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/gen/proto)
include_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/gen/protobuf-host/include)
include_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/eigen)
include_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/nsync/public)

#项目中lib路径
link_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/gen/lib)
link_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/gen/protobuf-host/lib)
link_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/nsync/builds/default.linux.c++11)
link_directories(${TENSORFLOW_DIR}/bazel-bin/tensorflow)

add_executable(demo main.cpp)
#连接libtensorflow_cc.so和libtensorflow_framework库。
target_link_libraries(demo tensorflow_cc tensorflow_framework)

最后执行文件,获得运行结果:

#使用cmake构建生成make文件
cmake .
#使用make编译
make 
#运行可执行文件
./demo

最终得到结果

rui@hopo:~/Files/CLionProjects/demo$ ./demo
2018-08-14 02:36:58.426849: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:895] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2018-08-14 02:36:58.427160: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1105] Found device 0 with properties: 
name: GeForce MX150 major: 6 minor: 1 memoryClockRate(GHz): 1.0375
pciBusID: 0000:01:00.0
totalMemory: 1.96GiB freeMemory: 1.01GiB
2018-08-14 02:36:58.427175: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1195] Creating TensorFlow device (/device:GPU:0) -> (device: 0, name: GeForce MX150, pci bus id: 0000:01:00.0, compute capability: 6.1)
Session successfully created.

说明成功安装Tensorflow C++ API借口。

猜你喜欢

转载自blog.csdn.net/qq_31261509/article/details/81666763