目錄
7、測試一:簡單測試編譯好的TensorFlow C++ API
8、測試二:Tensorflow C++ API調用Python預訓練模型
前言
TensorFlow C++ API的編譯是線上使用TensorFlow C++ API調用預先訓練好的模型完成預測項目的必經之路,但是TensorFlow C++ API的編譯並不是這麼順利,期間遇到了很多錯誤,它對版本要求非常嚴格,版本不對應會出現很多問題,尤其protobuf是最重要的一個。本篇是記錄TensorFlow C++ API順利編譯和測試的過程,爲線上使用TensorFlow C++ API的使用打下基礎。
1、軟件下載
(1)tensorflow-1.13.1源碼(tensorflow 1.13.1)
(2)bazel-0.19.2-installer-linux-x86_64.sh(bazel-0.19.2-installer-linux-x86_64.sh)
(3)Anaconda3-4.3.1-Linux-x86_64.sh(Anaconda3-4.3.1-Linux-x86_64.sh)
(4)protobuf-2.6.1.tar.gz(protobuf-2.6.1.tar.gz)
2、不同平臺版本對應要求
注意:TensorFlow C++ API的編譯對於bazel等工具的對應版本有要求,版本需要匹配,不然會有很多想不到的錯誤。
(1)Windows-CPU
版本 | Python 版本 | 編譯器 | 編譯工具 |
---|---|---|---|
tensorflow-1.13.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.12.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.11.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.10.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.9.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.8.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.7.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.6.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.5.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.4.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.3.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.2.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.1.0 | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 |
tensorflow-1.0.0 | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 |
(2)Linux-CPU
版本 | Python 版本 | 編譯器 | 編譯工具 |
---|---|---|---|
tensorflow-1.13.1 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.19.2 |
tensorflow-1.12.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.11.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.10.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 |
tensorflow-1.9.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.11.0 |
tensorflow-1.8.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
tensorflow-1.7.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.10.0 |
tensorflow-1.6.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.9.0 |
tensorflow-1.5.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.8.0 |
tensorflow-1.4.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.5.4 |
tensorflow-1.3.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
tensorflow-1.2.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 |
tensorflow-1.1.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |
tensorflow-1.0.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 |
(3)MacOS-CPU
版本 | Python 版本 | 編譯器 | 編譯工具 |
---|---|---|---|
tensorflow-1.13.1 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.19.2 |
tensorflow-1.12.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.15.0 |
tensorflow-1.11.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.15.0 |
tensorflow-1.10.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.15.0 |
tensorflow-1.9.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.11.0 |
tensorflow-1.8.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.10.1 |
tensorflow-1.7.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.10.1 |
tensorflow-1.6.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.8.1 |
tensorflow-1.5.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.8.1 |
tensorflow-1.4.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.5.4 |
tensorflow-1.3.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.4.5 |
tensorflow-1.2.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.4.5 |
tensorflow-1.1.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.4.2 |
tensorflow-1.0.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.4.2 |
(4) Windows-GPU
版本 | Python 版本 | 編譯器 | 編譯工具 | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow_gpu-1.13.0 | 3.5-3.6 | MSVC 2015 update 3 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.12.0 | 3.5-3.6 | MSVC 2015 update 3 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.11.0 | 3.5-3.6 | MSVC 2015 update 3 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.10.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.9.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.8.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.7.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.6.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.5.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 7 | 9 |
tensorflow_gpu-1.4.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 6 | 8 |
tensorflow_gpu-1.3.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 6 | 8 |
tensorflow_gpu-1.2.0 | 3.5-3.6 | MSVC 2015 update 3 | Cmake v3.6.3 | 5.1 | 8 |
tensorflow_gpu-1.1.0 | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 3.5 | MSVC 2015 update 3 | Cmake v3.6.3 | 5.1 | 8 |
(5)Linux-GPU
版本 | Python 版本 | 編譯器 | 編譯工具 | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow_gpu-1.13.1 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.19.2 | 7.4 | 10.0 |
tensorflow_gpu-1.12.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.11.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.10.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.15.0 | 7 | 9 |
tensorflow_gpu-1.9.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.11.0 | 7 | 9 |
tensorflow_gpu-1.8.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.10.0 | 7 | 9 |
tensorflow_gpu-1.7.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.6.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.9.0 | 7 | 9 |
tensorflow_gpu-1.5.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.8.0 | 7 | 9 |
tensorflow_gpu-1.4.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.5.4 | 6 | 8 |
tensorflow_gpu-1.3.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 6 | 8 |
tensorflow_gpu-1.2.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.5 | 5.1 | 8 |
tensorflow_gpu-1.1.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2.7、3.3-3.6 | GCC 4.8 | Bazel 0.4.2 | 5.1 | 8 |
(6)MacOS-GPU
版本 | Python 版本 | 編譯器 | 編譯工具 | cuDNN | CUDA |
---|---|---|---|---|---|
tensorflow_gpu-1.1.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.4.2 | 5.1 | 8 |
tensorflow_gpu-1.0.0 | 2.7、3.3-3.6 | XCode 中的 Clang | Bazel 0.4.2 | 5.1 | 8 |
3、環境配置
(1)安裝Anaconda
/mnt/f/linux$ ./Anaconda3-4.3.1-Linux-x86_64.sh
安裝過程中如果忘記將Anaconda添加環境變量,請使用以下方法添加環境變量。
方法一: 將Anaconda添加環境變量(該方法退出Linux重啓後無效)
$ export PATH=/home/asialee/anaconda3/bin:$PATH
$ source ~/.bashrc
方法二:將Anaconda永久添加環境變量(該方法退出Linux重啓後仍有效,配置稍微麻煩點)
$sudo vim /etc/profile
然後在打開的profile文本最後一行添加:export PATH=~/anaconda3/bin:$PATH
最後注入環境變量,讓其立即生效,重啓也有效
source /etc/profile
添加環境變量完成後,輸入python後得到顯示,即配置完成。
(2)安裝部分軟件
安裝bazel或者以下編譯操作可能需要安裝的部分軟件如下:
$ sudo apt install unzip
$ sudo apt install make
$ sudo apt install g++
$ sudo apt install gcc
$ sudo apt install cmake
sudo apt-get install autoconf
sudo apt-get install automake
sudo apt-get install libtool
sudo apt install curl(used to download gmock)
sudo apt-get install zlib1g-dev
sudo apt-get install liblzma-dev
如果安裝不成功,則需要更新sudo後再嘗試安裝,即:sudo apt update。
(3)安裝bazel
$ ./bazel-0.19.2-installer-linux-x86_64.sh --user
(4)安裝protobuf
protobuf是最重要的一個,對版本要求非常嚴格,版本不對應會出現很多問題;本次使用的版本是protobuf 2.6.1,比較穩定。
解壓protobuf-2.6.1.tar.gz
/mnt/f/linux$ tar -zxvf protobuf-2.6.1.tar.gz
進入解壓後的protobuf-2.6.1文件目錄,執行以下命令
/mnt/f/linux/protobuf-2.6.1$ ./configure
/mnt/f/linux/protobuf-2.6.1$ make
/mnt/f/linux/protobuf-2.6.1$ make install
注意:如果輸入make install 時會出現make: *** [install-recursive] Error 1問題,則輸入sudo make install 即可解決。
方法一:將protobuf加入環境變量(該方法重啓後無效)
$ export LD_LIBRARY_PATH=/usr/local/lib
方法二: 將protobuf永久加入環境變量(重啓後仍有效)
- $sudo vim /etc/profile
- 然後在打開的profile文本最後一行添加:export LD_LIBRARY_PATH=/usr/local/lib
- 最後注入環境變量,讓其立即生效,重啓也有效:source /etc/profile
查看版本以驗證安裝
$ protoc --version
4、配置TensorFlow安裝選項
進入源碼根目錄,運行 ./configure 進行配置。可參考 官網 -> Build from source -> View sample configuration session 設置,如果只需要配置cpu環境就一直回車。
/mnt/f/linux/tensorflow-1.13.1$ ./configure
5、使用bazel進行編譯生成動態庫
#編譯C++ API,生成.so文件,Tensorflow調用CUDA
/mnt/f/linux/tensorflow-1.13.1$ bazel build --config=opt --config=cuda //tensorflow:libtensorflow_cc.so
#編譯C++ API,生成.so文件,Tensorflow不調用CUDA
/mnt/f/linux/tensorflow-1.13.1$ bazel build --config=opt //tensorflow:libtensorflow_cc.so
等待編譯大約半個多小時,就成功編譯:
編譯成功後,tensorflow-1.13.1目錄下會出現 bazel-xxx 的幾個文件,在tensorflow-1.13.1/bazel-bin/tensorflow文件下會出現 libtensorflow_cc.so 和 libtensorflow_framework.so 動態庫文件。(動態庫文件下載)
6、編譯其他依賴
cd /mnt/f/linux/tensorflow-1.13.1/tensorflow/contrib/makefile$ ./build_all_linux.sh
執行成功後,在tensorflow-1.13.1/tensorflow/contrib/makefile目錄下:downloads文件夾下存放第三方依賴的一些頭文件和靜態庫,比如nsync、Eigen、protobuf等。
說明:Eigen 是一個高層次的C ++庫,有效支持線性代數,矩陣和矢量運算,數值分析及其相關的算法;Protocol Buffers (簡稱 Protobuf)是 Google 開源的一款跨語言,跨平臺,擴展性好的序列化工具,相比於 XML 和 JSON 等流行的編碼格式,這種數據結構化語言需要使用protoc進行編譯。
7、測試一:簡單測試編譯好的TensorFlow C++ API
(1)創建一個demo文件夾,demo文件夾下具體內容目錄如下
├── src
| └── test.cpp
├── CMakeLists.txt
其中,test.cpp爲C++測試代碼,具體如下:
#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 2.8.8)
#項目名稱/工程名
project(demo)
#設置c++編譯器
# Set C++14 as standard for the whole project
set(CMAKE_CXX_STANDARD 14)
#設置TENSORFLOW_DIR變量,變量內容爲安裝的tensorflow文件夾路徑
set(TENSORFLOW_DIR /mnt/f/linux/tensorflow-1.13.1)
# 將源碼目錄保存到變量中
aux_source_directory(./src DIR_SRCS) # 搜索當前目錄下的所有.cpp文件
#add_library(demo ${SRC_LIST}) #明確指定包含哪些源文件
#設置包含的目錄,項目中的include路徑,換成自己的路徑即可
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
/mnt/f/linux/tensorflow-1.13.1
/mnt/f/linux/tensorflow-1.13.1/bazel-genfiles
/mnt/f/linux/tensorflow-1.13.1/bazel-bin/tensorflow
/mnt/f/linux/tensorflow-1.13.1/tensorflow/contrib/makefile/downloads/nsync/public
/mnt/f/linux/tensorflow-1.13.1/tensorflow/contrib/makefile/downloads/eigen
/mnt/f/linux/tensorflow-1.13.1/tensorflow/contrib/makefile/downloads/absl
)
#設置鏈接庫搜索目錄,項目中lib路徑
link_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/nsync/builds/default.linux.c++11)
link_directories(${TENSORFLOW_DIR}/mnt/f/linux/tensorflow-1.13.1/bazel-bin/tensorflow) #動態鏈接庫目錄
#添加要編譯的可執行文件
#add_executable(demo test.cpp)
add_executable(demo ${DIR_SRCS}) ## 生成可執行文件
#設置 target 需要鏈接的庫
#添加可執行文件所需要的庫,連接libtensorflow_cc.so和libtensorflow_framework庫,鏈接動態鏈接庫
#target_link_libraries(demo tensorflow_cc tensorflow_framework)
target_link_libraries(demo /mnt/f/linux/tensorflow-1.13.1/bazel-bin/tensorflow/libtensorflow_cc.so /mnt/f/linux/tensorflow-1.13.1/bazel-bin/tensorflow/libtensorflow_framework.so)
(2)編譯和運行
mkdir build #創建build文件,是爲了將編譯程序放到build文件中
cd build
cmake .. #使用cmake構建生成make文件
make #使用make編譯
./demo #運行可執行文件
運行結果如下:
8、測試二:Tensorflow C++ API調用Python預訓練模型
線下使用TensorFlow Python API訓練模型,線上使用TensorFlow C++ API調用預先訓練好的模型完成預測。
測試流程:
- 使用TensorFlow Python API編寫和訓練模型,訓練完成後,使用tensorflow saver 將模型保存下來。
- 使用TensorFlow C++ API構建新的session,讀取Python版本保存的模型,然後使用session->run()獲得模型的輸出。
- 編譯和運行基於TensorFlow C++ API寫的代碼
(1)使用Tensorflow Python API線下定義模型和訓練
# -*-coding:utf-8 -*-
import tensorflow as tf
import os
# 使用Tensorflow Python API線下定義模型和訓練
def tain_model():
train_dir = os.path.join('data/demo', "demo")
a = tf.compat.v1.placeholder(dtype=tf.int32, shape=None, name='a')
b = tf.compat.v1.placeholder(dtype=tf.int32, shape=None, name='b')
y = tf.Variable(tf.ones(shape=[1], dtype=tf.int32), dtype=tf.int32, name='y')
res = tf.add(tf.multiply(a, b), y, name='res')
with tf.Session() as sess:
feed_dict = dict()
feed_dict[a] = 2
feed_dict[b] = 3
fetch_list = [res]
sess.run(tf.compat.v1.global_variables_initializer())
saver = tf.compat.v1.train.Saver()
# 訓練和保存模型
res = sess.run(feed_dict=feed_dict, fetches=fetch_list)
saver.save(sess, train_dir)
print("result: ", res[0])
#使用Tensorflow Python API 載入和運行模型
def load_model():
with tf.Session() as sess:
saver = tf.compat.v1.train.import_meta_graph('data/demo/demo.meta')
saver.restore(sess, tf.train.latest_checkpoint('data/demo/'))
# sess.run()
graph = tf.compat.v1.get_default_graph()
a = graph.get_tensor_by_name("a:0")
b = graph.get_tensor_by_name("b:0")
feed_dict = {a: 2, b: 3}
op_to_restore = graph.get_tensor_by_name("res:0")
print(sess.run(fetches=op_to_restore, feed_dict=feed_dict))
if __name__ == '__main__':
#先訓練模型
tain_model()
#導入訓練好的模型測試結果
load_model()
運行結果如下:
result: [7]
[7]
生成的模型保存在demo文件夾下:
checkpoint #模型checkpoint中的一些文件名的信息
demo.data-00000-of-00001 #模型中保存的各個權重
demo.index #可能是保存的各個權重的索引
demo.meta #模型構造的圖的拓撲結構
(2)使用Tensorflow C++ API讀入預訓練模型
Tensorflow C++代碼寫入test.cpp文件中:
#include <iostream>
#include "tensorflow/core/public/session.h"
#include "tensorflow/core/protobuf/meta_graph.pb.h"
#include "tensorflow/cc/client/client_session.h"
#include "tensorflow/cc/ops/standard_ops.h"
#include "tensorflow/core/framework/tensor.h"
using namespace std;
using namespace tensorflow;
int main()
{
const string pathToGraph = "/mnt/f/linux/demo/demo_model/demo.meta";
const string checkpointPath = "/mnt/f/linux/demo/demo_model/demo";
auto session = NewSession(SessionOptions());
if (session == nullptr)
{
throw runtime_error("Could not create Tensorflow session.");
}
Status status;
// 讀入我們預先定義好的模型的計算圖的拓撲結構
MetaGraphDef graph_def;
status = ReadBinaryProto(Env::Default(), pathToGraph, &graph_def);
if (!status.ok())
{
throw runtime_error("Error reading graph definition from " + pathToGraph + ": " + status.ToString());
}
// 利用讀入的模型的圖的拓撲結構構建一個session
status = session->Create(graph_def.graph_def());
if (!status.ok())
{
throw runtime_error("Error creating graph: " + status.ToString());
}
// 讀入預先訓練好的模型的權重
Tensor checkpointPathTensor(DT_STRING, TensorShape());
checkpointPathTensor.scalar<std::string>()() = checkpointPath;
status = session->Run(
{{ graph_def.saver_def().filename_tensor_name(), checkpointPathTensor },},
{},
{graph_def.saver_def().restore_op_name()},
nullptr);
if (!status.ok())
{
throw runtime_error("Error loading checkpoint from " + checkpointPath + ": " + status.ToString());
}
// 構造模型的輸入,相當與python版本中的feed
std::vector<std::pair<string, Tensor>> input;
tensorflow::TensorShape inputshape;
inputshape.InsertDim(0,1);
Tensor a(tensorflow::DT_INT32,inputshape);
Tensor b(tensorflow::DT_INT32,inputshape);
auto a_map = a.tensor<int,1>();
a_map(0) = 2;
auto b_map = b.tensor<int,1>();
b_map(0) = 3;
input.emplace_back(std::string("a"), a);
input.emplace_back(std::string("b"), b);
// 運行模型,並獲取輸出
std::vector<tensorflow::Tensor> answer;
status = session->Run(input, {"res"}, {}, &answer);
Tensor result = answer[0];
auto result_map = result.tensor<int,1>();
cout<<"result: "<<result_map(0)<<endl;
return 0;
}
(3)編譯和運行
編寫CMakeLists.txt文件,文件內容如下:
#指定 cmake 的最小版本
cmake_minimum_required(VERSION 2.8.8)
#項目名稱/工程名
project(demo)
#設置c++編譯器
# Set C++14 as standard for the whole project
set(CMAKE_CXX_STANDARD 14)
#設置TENSORFLOW_DIR變量,變量內容爲安裝的tensorflow文件夾路徑
set(TENSORFLOW_DIR /mnt/f/linux/tensorflow-1.13.1)
# 將源碼目錄保存到變量中
aux_source_directory(./src DIR_SRCS) # 搜索當前目錄下的所有.cpp文件
#add_library(demo ${SRC_LIST}) #明確指定包含哪些源文件
#設置包含的目錄,項目中的include路徑,換成自己的路徑即可
include_directories(
${CMAKE_CURRENT_SOURCE_DIR}
/mnt/f/linux/tensorflow-1.13.1
/mnt/f/linux/tensorflow-1.13.1/bazel-genfiles
/mnt/f/linux/tensorflow-1.13.1/bazel-bin/tensorflow
/mnt/f/linux/tensorflow-1.13.1/tensorflow/contrib/makefile/downloads/nsync/public
/mnt/f/linux/tensorflow-1.13.1/tensorflow/contrib/makefile/downloads/eigen
/mnt/f/linux/tensorflow-1.13.1/tensorflow/contrib/makefile/downloads/absl
)
#設置鏈接庫搜索目錄,項目中lib路徑
link_directories(${TENSORFLOW_DIR}/tensorflow/contrib/makefile/downloads/nsync/builds/default.linux.c++11)
link_directories(${TENSORFLOW_DIR}/mnt/f/linux/tensorflow-1.13.1/bazel-bin/tensorflow) #動態鏈接庫目錄
#添加要編譯的可執行文件
#add_executable(demo test.cpp)
add_executable(demo ${DIR_SRCS}) ## 生成可執行文件
#設置 target 需要鏈接的庫
#添加可執行文件所需要的庫,連接libtensorflow_cc.so和libtensorflow_framework庫,鏈接動態鏈接庫
#target_link_libraries(demo tensorflow_cc tensorflow_framework)
target_link_libraries(demo /mnt/f/linux/tensorflow-1.13.1/bazel-bin/tensorflow/libtensorflow_cc.so /mnt/f/linux/tensorflow-1.13.1/bazel-bin/tensorflow/libtensorflow_framework.so)
編譯及結果如下:
注意:在測試的的時候可能會遇到的protobuf版本錯誤問題,如果遇到了該問題,則需要解決protobuf版本問題,重新編譯後再測試。
錯誤描述:
#if 2006001 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION#error This file was generated by an older version of protoc which is#error incompatible with your Protocol Buffer headers. Please#error regenerate this file with a newer version of protoc.#endif
錯誤原因:
問題可能在於,系統上已安裝的標頭(在/ usr / include / google / protobuf或/ usr / local / include / google / protobuf中)來自於協議緩衝區的較新版本protoc。可能是兩個版本都安裝在不同的位置,並且使用了錯誤的版本。