Tensorflow C++ api 開發(fā) 例一

在獲得libtensorflow_cc.so和libtensorflow_framework.so庫后,開始進行C++api開發(fā)

  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并判斷是否成功創(chuàng)建。

  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動態(tài)庫的路徑
  • tensorflow-master是tensorflow的源碼路徑
  • Eigen3是Eigen3的目錄
  • nsync-1.20.0是nsync的安裝目錄
  • protobuf_bin是protobuf的安裝目錄,tensorflow用到了protobuf,如果不包含這個路徑,編譯的時候不會提示缺少某頭文件,而是會提示某某頭文件的版本不對。一般來說,在安裝protobuf時已經將這個路徑加到環(huán)境變量中了,此時在開發(fā)環(huán)境中不加也沒關系,但如果要轉移到其他環(huán)境,就需要拷貝這個目錄并包含。

有意思的是,通過tensorflow源碼也能生成這個目錄,在源碼的tensorflow/contrib/makefile目錄下,找到build_all_xxx.sh文件并執(zhí)行(不要用sh命令,直接執(zhí)行),成功后會出現一個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文件夾放置一些頭文件一樣,這個文件夾下則有許多在編譯動態(tài)庫時生成的頭文件,這些對c++ api來說必不可缺的。
??在編譯的時候,程序會從源碼目錄下的tensorflow文件夾里尋找所需頭文件,同時也會從該目錄下的tensorflow文件夾里尋找文件。
??值得注意的是,在程序打包或遷移環(huán)境的時候很容易會忘掉這個文件夾,造成頭文件缺失,往往是該文件沒有拷貝走,bazel-genfiles指不到地方,打包時可以把該目錄下的tensorflow目錄與源碼的tensorflow目錄合并。這樣include一個文件夾即可。同樣的,其他依賴庫的頭文件在打包時也要注意是否存在,可以把這些目錄單獨拷貝出來整理。

  1. 編譯
mkdir build
cd ./build
cmake ..
make

執(zhí)行生成的tf_test,輸出Session successfully created.即表示成功

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1. 介紹 首先讓我們來看看TensorFlow! 但是在我們開始之前,我們先來看看Python API中的Ten...
    JasonJe閱讀 11,975評論 1 32
  • 之前實習的時候訓練一個給ASR文本添加大小寫和標點的模型,框架用的是tensorflow r1.2(本文其實和te...
    PROoshio閱讀 14,229評論 11 6
  • 昨日,收到皇甫戰(zhàn)友從杭州寄來的明前龍井,夜間我就夢到了他。夢回吹角連營,依然年輕帥氣,夢中他和另一個戰(zhàn)友李良兵都調...
    入紅塵難閱讀 668評論 1 5
  • 前幾天很多公眾號都在討論一件事,一個女大學生不堪忍受在火鍋店里吵鬧不已的熊孩子,上去踢了幾腳。很多人紛紛譴責抨擊,...
    孟小繁閱讀 283評論 0 0
  • 不管和他的事情怎么處理,考博的事情我肯定不會放棄,也不應該放棄。因為這是我一輩子的事情,不應該為了什么而放棄
    果汁糖123閱讀 82評論 0 0

友情鏈接更多精彩內容