windows下编译tensorflow1.3c++library及创建一个简单的tensorflowc++程序

只需一步 只需一步     2022-09-22     427

关键词:

       由于最近比较忙,一直到假期才有空,因此将自己学到的知识进行分享。如果有不对的地方,请指出,谢谢!目前深度学习越来越火,学习、使用tensorflow的相关工作者也越来越多。最近在研究tensorflow线下采用 python 脚本训练出模型, 利用freeze_graph工具输出.pb图文件,之后再线上生产环境windows平台上用C++代码直接调用预先训练好的模型完成预测的工作。因为目前tensorflow提供的C++的API比较少,所以参考了以上几篇已有的日志,做个总结。这里编译出TensorFlow C++ library,遇到的坑进行填埋。之后的调用C++library相对比较简单,可以参考链接部分。

Step1:Windows 10必备环境准备

1.1安装VS2015

1.2安装Swigwin-3.0.12,其可执行文件地址为 D:/lib/swigwin-3.0.12/swig.exe

1.4安装python3.5,安装时注意选择将路径添加到环境变量。

1.5安装CMake-3.8.0 ,安装时注意选择将路径添加到环境变量。

1.6安装Git,用于在编译过程中从GitHub上下载依赖项。

1.7 将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()

总结下这一部分的三个重要地址:

Python可执行文件地址为:D:/lib/Python35/python.exe;
Python库文件地址为:D:/lib/Python35/libs/python35.lib(release版本), D:/lib/Python35/libs/python35_d.lib(Debug版本);
Swigwin可执行文件地址:D:/lib/swigwin-3.0.12/swig.exe。

 

Step2:编译 TensorFlow shared lib

2.1 打开文件夹 D:\tf\tensorflow-master\tensorflow\contrib\cmake, 新建文件夹\build。以管理员身份运行 开始 \ 所有程序 \ Visual Studio 2015\Visual Studio Tools\ Developer Command Prompt for VS 2015,输入powershell,使用命令切换到新建的build文件夹下。使用指令1用于build编译项目。可以看到,使用的就是上一部分保存的三个路径。当命令行中出现Generating done,说明build成功。

# 指令1(release)
cmake .. -A x64 -DCMAKE_BUILD_TYPE=Release -DSWIG_EXECUTABLE=D:/lib/swigwin-3.0.12/swig.exe-DPYTHON_EXECUTABLE=D:/lib/Python35/python.exe -DPYTHON_LIBRARIES=D:/lib/Python35/libs/python35.lib -Dtensorflow_BUILD_SHARED_LIB=ON

# 指令1(debug)
cmake .. -A x64 -DCMAKE_BUILD_TYPE=Debug -DSWIG_EXECUTABLE=D:/lib/swigwin-3.0.12/swig.exe-DPYTHON_EXECUTABLE=D:/lib/Python35/python.exe -DPYTHON_LIBRARIES=D:/lib/Python35/libs/python35_d.lib-Dtensorflow_BUILD_SHARED_LIB=ON

或者,这里我用cmake-gui界面进行cmake编译出release和debug版本,如下图所示:

 

2.2 命令行中输入指令2开始编译,在编译过程中保持网络畅通,有15个依赖库需要下载。编译过程中可能出现一些警告,不用担心,只要没有错误编译就可以通过。

 
# 指令2(release)
MSBuild /p:Configuration=Release ALL_BUILD.vcxproj
# 指令2(debug)
MSBuild /p:Configuration=Debug ALL_BUILD.vcxproj

 

2.3 但是,我在自己的电脑上编译失败,并出现了90个错误,这些错误都指向了两文件:

D:\tf\tensorflow-master\tensorflow\contrib\cmake\build\re2\src\re2\re2\testing\re2_test.cc
D:\tf\tensorflow-master\tensorflow\contrib\cmake\build\re2\src\re2\re2\testing\search_test.cc

 

re2包提供了正则表达式的功能,文件夹testing中是测试文件,在TensorFlow运行过程中其实不需要这些测试功能,所以可以通过禁止编译re2的测试部分来移除这些错误。

Step3:排除错误

3.1对出错的工程文件夹下,修改文件D:\tf\tensorflow-master\tensorflow\contrib\cmake\build\re2\src\re2\CMakeLists.txt(一定要FQ下载到),将第16行修改为:

option(RE2_BUILD_TESTING “enable testing for RE2” OFF)

,并保存。

3.2 重新进行编译(步骤2.2)。在编译过程中,会出现错误:

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V140\Microsoft.CppCommon.targets(171,5): error MSB6006: “cmd.exe”已退
出,代码为 1。 [D:\tensorflow-master\tensorflow\contrib\cmake\build\grpc.vcxproj]

这个应该是没有成功下载grpc,这个应该是个bug,给的链接不对(多次编译都编不过去),百度了下grpc对我现在的应用暂时用不多(不了解可以百度gprc)因此,暂时不需要grpc,也就不下载,编辑文件tensorflow/tensorflow/contrib/cmake/CMakeLists.txt,将第23行修改如下:

option(tensorflow_ENABLE_GRPC_SUPPORT "Enable gRPC support" OFF)

3.3重新cmake 和Build编译项目,并重新进行编译,重复步骤2.1,2.2和3.1。可能会出现错误:

fatal error C1060: compiler is out of heap space

这应该是跟自己的硬件相关,我自己的电脑配置不太好。出现这个错误,首先等待编译过程的完成,然后重复运行指令2。大概重复运行两三次这个问题就没有了。每次重复运行前,需等待整个编译过程完成。

也可能会出现这样的错误(Debug编译出现这样的错误):

这可能在实际中编译采用的是x86,并没有真正采用x64的环境进行编译,因此打开命令窗口Developer Command Prompt for VS 2015,输入powershell,使用命令切换到新建的build文件夹下,输入指令3,然后在输入指令2。

# 指令3
set PreferredToolArchitecture=x64

3.4 编译到最后会出现错误(debug版本比较严格)符号重载的错误,如下图所示:

error C2678: binary '<': no operator found which takes a left-hand operand of type IndicesRowIterator

 修改对应的文件夹下的文件,我这里是D:\tf\tensorflow-master-ngrpc\tensorflow\contrib\boosted_trees\lib\utils\sparse_column_iterable.cc,增加到文件中,增加的内容如下所示:

bool operator<( const IndicesRowIterator& other ) const {
QCHECK_LT( iter_, other.iter_ );
return ( row_idx_ < other.row_idx_ );
}

最终编译成功。出现需要的相应的release和debug版本的lib和动态链接库

Step4:在Windows上编译和运行一个简单的TensorFlow C++ 程序

4.1在vs2015中创建一个新的工程solution,并在对应的文件中输入如下:

#include <vector>
#include <eigen/Dense>

#include "matmul.h"
#include "tensorflow/core/public/session.h"
#include "tensorflow/cc/ops/standard_ops.h"

using namespace tensorflow;

// Build a computation graph that takes a tensor of shape [?, 2] and
// multiplies it by a hard-coded matrix.
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();
}

 

4.2在对应的头文件中输入如下:

#pragma once

#define COMPILER_MSVC
#define NOMINMAX

 

4.3在vs2015中,属性配置界面中,include Directories:

D:\tf\tensorflow-master-ngrpc\tensorflow\contrib\cmake\build\Debug
D:\tf\tensorflow-master-ngrpc\tensorflow\contrib\cmake\build\external\nsync\public
D:\tf\tensorflow-master-ngrpc\tensorflow\contrib\cmake\build\protobuf\src\protobuf\src
D:\tf\tensorflow-master-ngrpc\tensorflow\contrib\cmake\build\external\eigen_archive
D:\tf\tensorflow-master-ngrpc\tensorflow\contrib\cmake\build
D:\tf\tensorflow-master-ngrpc
D:\tf\tensorflow-master-ngrpc\third_party\eigen3

4.4在vs2015中,属性配置界面中,Additional Library Directories(release版本):

D:\tf\tensorflow-master-ngrpc\tensorflow\contrib\cmake\build\Release

4.5在vs2015中,属性配置界面中,Linker Settings(release版本):

tensorflow.lib

4.6编译和运行程序,运行结果如下所示:

 7 17
-1 -3

参考:

https://joe-antognini.github.io/machine-learning/build-windows-tf

http://quqixun.com/?p=785

http://blog.csdn.net/longji/article/details/72760409

http://blog.csdn.net/rockingdingo/article/details/75452711

https://github.com/tensorflow/tensorflow/issues

https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/cmake

https://stackoverflow.com/questions/42603407/how-to-compile-tensor-flow-with-sse-and-and-avx-instructions-on-windows

 

windows下编译及使用libevent

Libevent官网:http://libevent.org/windows7下编译:编译环境: windows7+VS2010(1)解压libevent到F:libeventlibevent-2.0.21-stable(2)打开Microsoftvisualstudio2010命令行工具(3)修改以下三个文件,添加宏定义:在以下3个文件开头添加“#define_... 查看详情

[转]windows下编译及使用libevent

http://www.cnblogs.com/luxiaoxun/p/3603399.html  Libevent官网:http://libevent.org/windows7下编译:编译环境: windows7+VS2010(1)解压libevent到F:libeventlibevent-2.0.21-stable(2)打开Microsoftvisualstud 查看详情

windows下编译libevent

  1从github上gitclonehttps://github.com/nmathewson/Libevent.git或者直接下载zip包.然后找到vs2015命令行,打开2:3:等待结果  4使用demo测试包含目录 库目录附加依赖项:  查看详情

Windows下编译Mongoose的hello.c

】Windows下编译Mongoose的hello.c【英文标题】:CompilingMongoose\'shello.cunderWindows【发布时间】:2013-03-2011:48:43【问题描述】:我正在尝试在Windows下从Mongoose编译包含的hello.c示例。我正在使用MicrosoftVisual命令提示符,并且已将mongoose.c和... 查看详情

windows下编译iconv

从http://www.gnu.org/software/libiconv/ 下载 libiconv-1.11.1,这是最后一个支持MSVC编译的版本。编译64位Lib命令行cmd执行amd64位脚本,D:ProgramFiles(x86)MicrosoftVisualStudio8VCinamd64vcvarsamd64.bat转移到libiconv-1.11. 查看详情

记录windows下编译chromium,备忘

编译windows下chromium,时间:20170619,官方地址:https://chromium.googlesource.com/chromium/src/+/master/docs/windows_build_instructions.md 一.系统要求:1.64位机器,至少8GB的内存,推荐16GB以上。(我用的Win1064位虚拟机,内存按照8G来的);2.至... 查看详情

windows下编译jcef(代码片段)

...文参考官方网站上的jcef编译过程编译成功的环境如下:windows1064bitJDK1.8.0_12164bitPython2.7.13gitversion2.12.1.windows.1cmakeversion3.12.0-rc1VisualStudio2015EnterpriseEdition以上的软件也是官网上要求安装的软件,不过版本稍有不同,官网上的版本要... 查看详情

linux与windows下编译工具

Linuxgccg++make使用makefile调用gccg++cmake使用CMakeLists文件生成makefile文件qmake使用Qt中pro文件生成makefile,调用makeBoost使用BJam可设置不同的编译器Windowsres.execl.exelink.exenmake与多线程版的jom使用makefilevs项目(vcxproj,sln 查看详情

linux与windows下编译工具

Linuxgccg++make使用makefile调用gccg++cmake使用CMakeLists文件生成makefile文件qmake使用Qt中pro文件生成makefile,调用makeBoost使用BJam可设置不同的编译器Windowsres.execl.exelink.exenmake与多线程版的jom使用makefilevs项目(vcxproj,sln 查看详情

在windows环境idea下编译运行elasticsearch7.14.1(代码片段)

文章目录在Windows环境中IDEA下编译运行Elasticsearch7.14.1环境准备操作步骤获取源码方式一:直接通过`gitbash`执行`gitclone`命令方式二:通过IDEA界面化操作编译源码本地运行遇到的问题1.权限问题2.版本问题3.geoip报... 查看详情

windows(msvc)下编译boost库

下载&解压从http://www.boost.org/上下载源码并解压打开vs的本机工具命令提示符cdboost_sourcecode_dirbootstrap如果需要编译boost.python需要在boost_sourcecode_dir oolsuildexampleuser-config.jam中添加如下内容:usingmsvc:14.0;usingpython:2.7: 查看详情

qt在windows下编译遇到的一些问题

软件是在linux上写的,然而搬到windows上来遇到了好多问题。。。。想跪。。。。 首先就是压根编译不了的问题。。。。这个问题困扰我好久了。。。。一直报错undefinedreferencetoRInside和deplicatesection....如贴:http://www.qter.org/forum... 查看详情

在 Windows (XP) 下编译 C/C++ makefile 文件

】在Windows(XP)下编译C/C++makefile文件【英文标题】:CompilngC/C++makefilefilesunderWindows(XP)【发布时间】:2009-07-1023:06:19【问题描述】:我正在尝试使用具有一些非Python必备库的Python库(pyMedia)。(libogg、libvorbis、liblame和libfaad2-这与具体... 查看详情

windows下编译skia(代码片段)

转载请说明原出处,谢谢~~:https://redrain.blog.csdn.net/article/details/111685123 目录准备环境1.配置代理2.下载depot_tools3.下载skia4.假如没有梯子开始编译1.args的参数说明2.生成项目文件3.删除多余的命令用LLVM编译Skia剪裁手动去掉... 查看详情

windows下编译skia(代码片段)

转载请说明原出处,谢谢~~:https://redrain.blog.csdn.net/article/details/111685123 目录准备环境1.配置代理2.下载depot_tools3.下载skia4.假如没有梯子开始编译1.args的参数说明2.生成项目文件3.删除多余的命令用LLVM编译Skia剪裁手动去掉... 查看详情

windows10下编译openjdk8

只是编译,不调试。 一、安装Cygwin32位和64位都可以试试。https://cygwin.com/install.html把这些装上(https://hg.openjdk.java.net/jdk8u/jdk8u/raw-file/tip/README-builds.html) 二、下载源码(OpenJDK8)https://www.mercurial-scm.org/d 查看详情

windows下编译protobufv3.3.0

一:概述关于protobuf在此不再多说,此处记录下成功编译步骤以备日后查阅。注意:本文并不是使用cmakegui进行编译的,如果熟悉cmakegui的话,也可以使用gui进行生成编译。二:准备资源及工具VS2013或以上版本,安装好protobuf源码... 查看详情

在window下编译libgeotiff(含libtiff)

核心提示:1.GeoTiff简介GeoTiff是包含地理信息的一种Tiff格式的文件。1.GeoTiff简介    GeoTiff是包含地理信息的一种Tiff格式的文件。Libgeotiff就是一个操作GeoTiff文件的库。同GDAL,GeoTiff库功能强大,也是开源的。其主页... 查看详情