在獲得libtensorflow_cc.so和libtensorflow_framework.so庫(kù)后,開(kāi)始進(jìn)行C++api開(kāi)發(fā)
-
編寫(xiě)源文件
源文件:test.cc
#include "/home/zhouxd/tools/tensorflow-master/tensorflow/core/public/session.h"
//tensorflow-master為tensorflow源碼根目錄迹辐,不喜歡include這么長(zhǎng)的路徑可以把這個(gè)路徑加到cmakelist,再直接包含session.h
#include <iostream>
using namespace std;
using namespace tensorflow;
int main()
{
//僅僅為了測(cè)試Session對(duì)象能否成功建立
Session* session;
Status status = NewSession(SessionOptions(), &session);
if (!status.ok()) {
cout << status.ToString() << "\n";
return 1;
}
cout << "Session successfully created.\n";
}
該例子的任務(wù)是新建一個(gè)Session并判斷是否成功創(chuàng)建喊括。
- 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)
說(shuō)明:
- link_directories(./lib) 指定好so文件的路徑桐罕,這里我新建了lib文件夾把so文件放進(jìn)去了
- link_directories所指路徑是編譯好的tensorflow動(dòng)態(tài)庫(kù)的路徑
- tensorflow-master是tensorflow的源碼路徑
- Eigen3是Eigen3的目錄
- nsync-1.20.0是nsync的安裝目錄
- protobuf_bin是protobuf的安裝目錄该面,tensorflow用到了protobuf副渴,如果不包含這個(gè)路徑酣胀,編譯的時(shí)候不會(huì)提示缺少某頭文件刁赦,而是會(huì)提示某某頭文件的版本不對(duì)。一般來(lái)說(shuō)闻镶,在安裝protobuf時(shí)已經(jīng)將這個(gè)路徑加到環(huán)境變量中了甚脉,此時(shí)在開(kāi)發(fā)環(huán)境中不加也沒(méi)關(guān)系,但如果要轉(zhuǎn)移到其他環(huán)境铆农,就需要拷貝這個(gè)目錄并包含牺氨。
有意思的是,通過(guò)tensorflow源碼也能生成這個(gè)目錄墩剖,在源碼的tensorflow/contrib/makefile目錄下猴凹,找到build_all_xxx.sh文件并執(zhí)行(不要用sh命令,直接執(zhí)行)岭皂,成功后會(huì)出現(xiàn)一個(gè)gen文件夾郊霎,gen文件下面也有個(gè)protobuf/include文件夾,包含這個(gè)文件夾也是可以的蒲障。
- bazel-genfiles是在用bazel編譯tensorflow時(shí)在源碼目錄下生成的文件夾指向鏈接歹篓,它指向了另一個(gè)目錄瘫证,這個(gè)目錄也是在編譯tensorflow時(shí)生成的,我的機(jī)器上是
/home/zhouxd/.cache/bazel/_bazel_zhouxd/3ea11f2719d18e25c3b1b9955bf36e24/execroot/org_tensorflow/bazel-out/k8-opt/genfiles/
??可以看到該路徑是在用戶根目錄下生成的庄撮,有意思的一點(diǎn)是該目錄下也有一個(gè)tensorflow文件夾背捌,就像源碼目錄(tensorflow-master)下存在一個(gè)tensorflow文件夾放置一些頭文件一樣,這個(gè)文件夾下則有許多在編譯動(dòng)態(tài)庫(kù)時(shí)生成的頭文件洞斯,這些對(duì)c++ api來(lái)說(shuō)必不可缺的毡庆。
??在編譯的時(shí)候,程序會(huì)從源碼目錄下的tensorflow文件夾里尋找所需頭文件烙如,同時(shí)也會(huì)從該目錄下的tensorflow文件夾里尋找文件么抗。
??值得注意的是,在程序打包或遷移環(huán)境的時(shí)候很容易會(huì)忘掉這個(gè)文件夾亚铁,造成頭文件缺失蝇刀,往往是該文件沒(méi)有拷貝走,bazel-genfiles指不到地方徘溢,打包時(shí)可以把該目錄下的tensorflow目錄與源碼的tensorflow目錄合并吞琐。這樣include一個(gè)文件夾即可。同樣的然爆,其他依賴庫(kù)的頭文件在打包時(shí)也要注意是否存在站粟,可以把這些目錄單獨(dú)拷貝出來(lái)整理。
- 編譯
mkdir build
cd ./build
cmake ..
make
執(zhí)行生成的tf_test曾雕,輸出Session successfully created.即表示成功