windows环境VS2015编译TensorFlow C++程序完全攻略
本文参考和综合了多篇网络博客文章,加以自己的实践,最终终于在windows环境下,编译出可以用于C++程序调用tensorflow API的程序,并执行成功。
考虑到网络上关于这方面的资料还较少,特总结全过程如下,希望能帮助到有需要的码农朋友,文中有部分文字步骤是借鉴他人文章,引用路径在最后列出。
一、环境准备:
- 操作系统:windows8.1
- 安装visual stduio2015
- 安装Swigwin-3.0.12,注意其下载解压以后即可使用,本人放置路径在D:/lib/swigwin-3.0.12,可执行文件地址为 D:/swigwin-3.0.12/swig.exe
- 安装python3.5,安装时注意选择将路径添加到环境变量。
- 安装CMake-3.8.0 ,安装时注意选择将路径添加到环境变量。
- 安装Git,用于在编译过程中从GitHub上下载依赖项。
- 将GitHub上TensorFlow的master分支 下载并解压到文件夹D:\tf中,编辑文件tensorflow/tensorflow/contrib/cmake/CMakeLists.txt,将第87行至93行修改如下:
if (tensorflow_OPTIMIZE_FOR_NATIVE_ARCH)
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-march=native" COMPILER_OPT_ARCH_NATIVE_SUPPORTED)
if (COMPILER_OPT_ARCH_NATIVE_SUPPORTED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=native")
else()
CHECK_CXX_COMPILER_FLAG("/arch:AVX" COMPILER_OPT_ARCH_AVX_SUPPORTED)
if(COMPILER_OPT_ARCH_AVX_SUPPORTED)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:AVX")
endif()
endif()
endif()
二、使用CMAKE设置各项编译参数
- 打开下载tensorflow源文件的根目录,本文路径是E:TF Code/TensorFlow,在路径下进入../tensorflow\contrib\cmake, 新建文件夹\build。
- 打开已安装的CMAKE-GUI工具,进行各项编译选项的配置,本文配置界面如下:

- 点击configue,下方提示Configuring done后,点击Generate,等待Generating done后完成编译设置。如果中间有报错,请检测各路径设置是否正确。
三、编译生成tensorflow库文件
- 打开visual studio2015,打开E:\TF Code\tensorflow\tensorflow\contrib\cmake\build下的ALL_BUILD项目。我们在此只以release版本为例,所以检查编译平台是

- 点击生成解决方案,编译的时间很长,我的笔记本电脑编译一次大概3到4个小时,编译到最后一般都会报错
fatal error C1060: compiler is out of heap space 没关系,等待整个工程全部编译完成(据说内存特别大的电脑不会报)。
找到tf_core_kernels项目,右键单独编译,操作如下图。

4. tf_core_kernels项目编译成功后,再同样对tensorflow_static作单独编译,最后再对tensorflow作单独编译。.
这样tensorflow.lib和tensorflow.dll文件就可以编译出来了,生成的库文件路径在..\tensorflow\tensorflow\contrib\cmake\build\Release下。
四、使用tensorflow库文件编写C++程序
- 在vs2015中创建一个新的Win32控制台工程TestTensorFlow,注意也必须把编译平台设置成
。 - 新建一个TestTensorFlow.h,在其中输入
#pragma once #define COMPILER_MSVC
#define NOMINMAX - 对应的TestTensorFlow.CPP文件中输入如下:
// 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();
} - 设置要包含的tensorflow头文件路径,右键项目属性——C/C++——附加包含目录
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 - 引入tensorflow.lib文件,右键项目——添加——现有项,找到..\tensorflow\tensorflow\contrib\cmake\build\Release下的tensorflow.lib

5. 设置预编译选项,右键属性——C/C++——预处理器,预处理器定义中加入PLATFORM_WINDOWS

6. 编译TestTensorFlow项目,就可以成功生成TestTensorFlow.exe了。
7.直接运行程序,会报错
,
8,把..\tensorflow\tensorflow\contrib\cmake\build\Release下的tensorflow.dll拷贝到TestTensorFlow.exe同文件夹下,再运行即可成功得到输出结果如下:

输出结果有一句警告,好像是我编译参数还是跟CPU功能有不匹配,但是不影响执行结果,有知道如何解决的朋友可以留言给我,谢谢。
参考:
- https://www.cnblogs.com/jliangqiu2016/p/7642471.html
- http://www.qingpingshan.com/m/view.php?aid=322808
windows环境VS2015编译TensorFlow C++程序完全攻略的更多相关文章
- windows环境下Eclipse开发MapReduce程序遇到的四个问题及解决办法
按此文章<Hadoop集群(第7期)_Eclipse开发环境设置>进行MapReduce开发环境搭建的过程中遇到一些问题,饶了一些弯路,解决办法记录在此: 文档目的: 记录windows环 ...
- 基于DCMTK的DICOM相关程序编写攻略
2008年09月10日 星期三 15:35 基于DCMTK的DICOM相关程序编写攻略 前言: 由于现在的医学影像设备的图像存储和传输正在逐渐向DICOM标准靠拢,在我们进行医学图像处理的过程中,经常 ...
- Windows下 VS2015编译levelDB(nmake)
VS2015编译levelDB Leveldb是一个google实现的非常高效的kv数据库,非常适合嵌入到程序中.如果有简单的key-value数据库需求,而又想使用一个数据库服务的话,levelDB ...
- Windows用cmd编译运行C程序
在Windows环境下用命令行编译运行程序 浙江大学-C语言程序设计进阶 配置gcc 准备一个Dev-cpp 找到gcc.exe所在目录 Dev-Cpp\MinGW64\bin 地址栏右键将地址复制为 ...
- 在Windows 环境下编译Qt静态库(QT5.32)
参考链接 Qt5.3 Tools and Versions MinGW ICU ActivePerl Qt 安装MinGW工具链环境 这里在Win32环境下要安装一个MinGW工具链,这里最好是先安装 ...
- Openstack 二次开发之:在windows 环境下编译Openstack-java-sdk
在windows环境下使用maven对openstack-java-sdk进行编译 编译源文件 下载源代码 git clonehttps://github.com/woorea/openstack-j ...
- Windows下 VS2015编译RocksDB
VS2015编译RocksDB RocksDB 是一个来自 facebook 的可嵌入式的支持持久化的 key-value 存储系统,也可作为 C/S 模式下的存储数据库,但主要目的还是嵌入式.Roc ...
- Windows下 VS2015编译boost1.62
VS2015编译boost1.62 Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有 ...
- 在linux环境下编译运行OpenCV程序的两种方法
原来以为在Ubuntu下安装好了OpenCV之后,自己写个简单的程序应该很容易吧,但是呢,就是为了编译一个简单的显示图片的程序我都快被弄崩溃了. 在谷歌和上StackOverFlow查看相关问题解答之 ...
随机推荐
- python用户管理系统
学Python这么久了,第一次写一个这么多的代码(我承认只有300多行,重复的代码挺多的,我承认我确实垃圾),但是也挺不容易的 自定义函数+装饰器,每一个模块写的一个函数 很多地方能用装饰器(逻辑跟不 ...
- 从durable谈起,我是如何用搜索引擎抓住技术的关键字学习新姿势打开敏捷开发的大门
---又名我讨厌伸手党 我又把个人博客的子标题改为了 你可以在书和搜索引擎找到90%的问题的答案,为什么要问别人?剩下的10%或许没有答案,为什么要问别人? 这是由于最近在网上看到各种伸手,对于我这种 ...
- 两小时搞定C#版超级战舰游戏
课程简单介绍 游戏开发已然是眼下火星上都非常火的开发技术.而休闲的小游戏超级战舰也是眼下白领中最流行的小游戏.那超级战舰游戏是如何在两个小时高速搞定的呢?休闲类的小游戏高速开发的指南是什么?C#是如何 ...
- 向MapReduce转换:生成用户向量
分两部分: <span style="font-size:18px;">/*** * @author YangXin * @date 2016/2/21 * @ inf ...
- 询问Spring Bott和高并发框架两个问题
这里我问两个问题,请大神告诉我. 第一个问题,如果我想用Spring Boot开发企业级的微服务,我该看哪些资料?比如数据库该如何配置?消息中间件该怎么设置?等等.或者可以推荐给我几本这方面的书. 第 ...
- 大数据学习(4)MapReduce编程Helloworld:WordCount
Maven依赖: <dependency> <groupId>jdk.tools</groupId> <artifactId>jdk.tools< ...
- 让PIP源使用国内镜像,提升下载速度和安装成功率。
对于Python开发用户来讲,PIP安装软件包是家常便饭.但国外的源下载速度实在太慢,浪费时间.而且经常出现下载后安装出错问题.所以把PIP安装源替换成国内镜像,可以大幅提升下载速度,还可以提高安 ...
- 批量下载google 字体小工具
在项目开发中,我们经常用外国的框架,如bootstrap.nodejs.angularjs 时候经常要配套google 字体等资源, 但是由于国内网络原因,经常框架跑起来,网页在请求google 字体 ...
- 48、mysql补充
一 视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,可以将该结果集当做表来使用. 使用视图我们可以把查询过程中的 ...
- (一)最小的Django
本文为作者原创,转载请注明出处(http://www.cnblogs.com/mar-q/)by 负赑屃 本文基本内容均出自<Lightweight Django>(中文为<轻量级D ...