在獲得libtensorflow_cc.so和libtensorflow_framework.so庫后,開始進行C++api開發(fā)
-
編寫源文件
源文件: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)建。
- 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一個文件夾即可。同樣的,其他依賴庫的頭文件在打包時也要注意是否存在,可以把這些目錄單獨拷貝出來整理。
- 編譯
mkdir build
cd ./build
cmake ..
make
執(zhí)行生成的tf_test,輸出Session successfully created.即表示成功