Tensorflow C++ api 开发 例一

在获得libtensorflow_cc.so和libtensorflow_framework.so库后,开始进行C++api开发

  1. 编写源文件
    源文件:test.cc
#include "/home/zhouxd/tools/tensorflow-master/tensorflow/core/public/session.h"
//tensorflow-master为tensorflow源码根目录,不喜欢include这么长的路径可以把这个路径加到cmakelist,再直接包含session.h
#include <iostream>
using namespace std;
using namespace tensorflow;
int main()
{
    //仅仅为了测试Session对象能否成功建立
    Session* session;
    Status status = NewSession(SessionOptions(), &session);
    if (!status.ok()) {
        cout << status.ToString() << "\n";
        return 1;
    }
    cout << "Session successfully created.\n";
}

该例子的任务是新建一个Session并判断是否成功创建。

  1. CMakeLists.txt
cmake_minimum_required (VERSION 2.8.8)
project (tf_test)
 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -std=c++11 -W")
link_directories(./lib)
include_directories(
  /home/zhouxd/tools/tensorflow-master
  /home/zhouxd/tools/tensorflow-master/bazel-genfiles
  /home/zhouxd/tools/Eigen3
  /home/zhouxd/tools/protobuf_bin/include
  /home/zhouxd/tools/nsync-1.20.0/public
  ) 
add_executable(tf_test test.cc) 
target_link_libraries(tf_test tensorflow_cc tensorflow_framework)

说明:

  • link_directories(./lib) 指定好so文件的路径,这里我新建了lib文件夹把so文件放进去了
  • link_directories所指路径是编译好的tensorflow动态库的路径
  • tensorflow-master是tensorflow的源码路径
  • Eigen3是Eigen3的目录
  • nsync-1.20.0是nsync的安装目录
  • protobuf_bin是protobuf的安装目录,tensorflow用到了protobuf,如果不包含这个路径,编译的时候不会提示缺少某头文件,而是会提示某某头文件的版本不对。一般来说,在安装protobuf时已经将这个路径加到环境变量中了,此时在开发环境中不加也没关系,但如果要转移到其他环境,就需要拷贝这个目录并包含。

有意思的是,通过tensorflow源码也能生成这个目录,在源码的tensorflow/contrib/makefile目录下,找到build_all_xxx.sh文件并执行(不要用sh命令,直接执行),成功后会出现一个gen文件夹,gen文件下面也有个protobuf/include文件夹,包含这个文件夹也是可以的。

  • bazel-genfiles是在用bazel编译tensorflow时在源码目录下生成的文件夹指向链接,它指向了另一个目录,这个目录也是在编译tensorflow时生成的,我的机器上是
/home/zhouxd/.cache/bazel/_bazel_zhouxd/3ea11f2719d18e25c3b1b9955bf36e24/execroot/org_tensorflow/bazel-out/k8-opt/genfiles/

  可以看到该路径是在用户根目录下生成的,有意思的一点是该目录下也有一个tensorflow文件夹,就像源码目录(tensorflow-master)下存在一个tensorflow文件夹放置一些头文件一样,这个文件夹下则有许多在编译动态库时生成的头文件,这些对c++ api来说必不可缺的。
  在编译的时候,程序会从源码目录下的tensorflow文件夹里寻找所需头文件,同时也会从该目录下的tensorflow文件夹里寻找文件。
  值得注意的是,在程序打包或迁移环境的时候很容易会忘掉这个文件夹,造成头文件缺失,往往是该文件没有拷贝走,bazel-genfiles指不到地方,打包时可以把该目录下的tensorflow目录与源码的tensorflow目录合并。这样include一个文件夹即可。同样的,其他依赖库的头文件在打包时也要注意是否存在,可以把这些目录单独拷贝出来整理。

  1. 编译
mkdir build
cd ./build
cmake ..
make

执行生成的tf_test,输出Session successfully created.即表示成功

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. 介绍 首先让我们来看看TensorFlow! 但是在我们开始之前,我们先来看看Python API中的Ten...
    JasonJe阅读 11,959评论 1 32
  • 之前实习的时候训练一个给ASR文本添加大小写和标点的模型,框架用的是tensorflow r1.2(本文其实和te...
    PROoshio阅读 14,213评论 11 6
  • 昨日,收到皇甫战友从杭州寄来的明前龙井,夜间我就梦到了他。梦回吹角连营,依然年轻帅气,梦中他和另一个战友李良兵都调...
    入红尘难阅读 655评论 1 5
  • 前几天很多公众号都在讨论一件事,一个女大学生不堪忍受在火锅店里吵闹不已的熊孩子,上去踢了几脚。很多人纷纷谴责抨击,...
    孟小繁阅读 279评论 0 0
  • 不管和他的事情怎么处理,考博的事情我肯定不会放弃,也不应该放弃。因为这是我一辈子的事情,不应该为了什么而放弃
    果汁糖123阅读 80评论 0 0

友情链接更多精彩内容