本文参考和综合了多篇网络博客文章,加以本身的实践,最终终于在windows环境下,编译出能够用于C++程序调用tensorflow API的程序,并执行成功。php
考虑到网络上关于这方面的资料还较少,特总结全过程以下,但愿能帮助到有须要的码农朋友,文中有部分文字步骤是借鉴他人文章,引用路径在最后列出。html
1、环境准备:python
1 if (tensorflow_OPTIMIZE_FOR_NATIVE_ARCH) 2 include(CheckCXXCompilerFlag) 3 CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_OPT_ARCH_NATIVE_SUPPORTED) 4 if (COMPILER_OPT_ARCH_NATIVE_SUPPORTED) 5 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native") 6 else() 7 CHECK_CXX_COMPILER_FLAG("/arch:AVX" COMPILER_OPT_ARCH_AVX_SUPPORTED) 8 if(COMPILER_OPT_ARCH_AVX_SUPPORTED) 9 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX") 10 endif() 11 endif() 12 endif()
2、使用CMAKE设置各项编译参数git
3、编译生成tensorflow库文件github
fatal error C1060: compiler is out of heap space 不要紧,等待整个工程所有编译完成(听说内存特别大的电脑不会报)。
找到tf_core_kernels项目,右键单独编译,操做以下图。
4. tf_core_kernels项目编译成功后,再一样对tensorflow_static做单独编译,最后再对tensorflow做单独编译。.windows
这样tensorflow.lib和tensorflow.dll文件就能够编译出来了,生成的库文件路径在..\tensorflow\tensorflow\contrib\cmake\build\Release下。网络
4、使用tensorflow库文件编写C++程序session
#pragma once #define COMPILER_MSVC #define NOMINMAX
// TestTensorFlow.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include <vector> #include <eigen/Dense> #include "TestTensorFlow.h" #include "tensorflow/core/public/session.h" #include "tensorflow/cc/ops/standard_ops.h" using namespace tensorflow; GraphDef CreateGraphDef() { Scope root = Scope::NewRootScope(); auto X = ops::Placeholder(root.WithOpName("x"), DT_FLOAT, ops::Placeholder::Shape({ -1, 2 })); auto A = ops::Const(root, { { 3.f, 2.f },{ -1.f, 0.f } }); auto Y = ops::MatMul(root.WithOpName("y"), A, X, ops::MatMul::TransposeB(true)); GraphDef def; TF_CHECK_OK(root.ToGraphDef(&def)); return def; } int main() { GraphDef graph_def = CreateGraphDef(); // Start up the session SessionOptions options; std::unique_ptr<Session> session(NewSession(options)); TF_CHECK_OK(session->Create(graph_def)); // Define some data. This needs to be converted to an Eigen Tensor to be // fed into the placeholder. Note that this will be broken up into two // separate vectors of length 2: [1, 2] and [3, 4], which will separately // be multiplied by the matrix. std::vector<float> data = { 1, 2, 3, 4 }; auto mapped_X_ = Eigen::TensorMap<Eigen::Tensor<float, 2, Eigen::RowMajor>> (&data[0], 2, 2); auto eigen_X_ = Eigen::Tensor<float, 2, Eigen::RowMajor>(mapped_X_); Tensor X_(DT_FLOAT, TensorShape({ 2, 2 })); X_.tensor<float, 2>() = eigen_X_; std::vector<Tensor> outputs; TF_CHECK_OK(session->Run({ { "x", X_ } }, { "y" }, {}, &outputs)); // Get the result and print it out Tensor Y_ = outputs[0]; std::cout << Y_.tensor<float, 2>() << std::endl; session->Close(); getchar(); }
E:\TF Code\tensorflow\tensorflow\contrib\cmake\build\Debug E:\TF Code\tensorflow\tensorflow\contrib\cmake\build\external\nsync\public E:\TF Code\tensorflow\tensorflow\contrib\cmake\build\protobuf\src\protobuf\src E:\TF Code\tensorflow\tensorflow\contrib\cmake\build\external\eigen_archive E:\TF Code\tensorflow\tensorflow\contrib\cmake\build E:\TF Code\tensorflow E:\TF Code\tensorflow\third_party\eigen3
5. 设置预编译选项,右键属性——C/C++——预处理器,预处理器定义中加入PLATFORM_WINDOWSapp
6. 编译TestTensorFlow项目,就能够成功生成TestTensorFlow.exe了。工具
7.直接运行程序,会报错,
8,把..\tensorflow\tensorflow\contrib\cmake\build\Release下的tensorflow.dll拷贝到TestTensorFlow.exe同文件夹下,再运行便可成功获得输出结果以下:
输出结果有一句警告,好像是我编译参数仍是跟CPU功能有不匹配,可是不影响执行结果,有知道如何解决的朋友能够留言给我,谢谢。
参考: