windows下,编译c++版本的tensorflow(cpu版本)

花了整整一天的时间,终于编译好了c++版本的tensorflow,下面将给出我的整个编译过程,我只能说过程很艰辛,查了很多资料,不过最后总算是成功了,功夫不负有心人。下面将给我的编译过程:

参考博客:

https://blog.csdn.net/jiugeshao/article/details/79144438

https://www.jianshu.com/p/3549c8e9cc15

http://blog.csdn.net/xihuaxi/article/details/62217011

https://www.cnblogs.com/dongsheng/p/4011145.html

一、需要的工具

1.cmake-3.10.1 (下载链接:https://github.com/Kitware/CMake/releases)

       选择cmake-3.10.1-win64-x64.zip

2. swigwin-3.0.12(下载链接:http://www.linuxfromscratch.org/blfs/view/cvs/general/swig.html

3. VS2017

4. 下载tensorflow1.3源码(链接https://github.com/tensorflow/tensorflow/releases

注意:安装好cmake和swigwin后,将对应路径添加到环境变量中去

二、编译过程

1.打开cmake-gui

windows下,编译c++版本的tensorflow(cpu版本)

 

先点击configure,然后按照图示勾选tensorflow目录下的选项

注意一定要勾选tensorflow_BUILD_SHARED_LIB,勾选了这个之后,最后才会生成一个总体的tensorflow.dll,不然的话,生成的都是分散的文件。

然后再点击configure和generate

然后点击 Open Project,打开解决方案,现在先别急着点生成

2. 生成前的准备

  按win+R,输入“C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\vcvars64.bat”  这一步是准备我们的运行环境

将环境变量中加入:PreferredToolArchitecture=x64

3. 生成过程

①菜单栏中的工具(T)→选项(O)→项目和解决方案→生成并运行,将最大并行项目生成数设置为1

预防出现错误:fatal error C1060: 编译器的堆空间不足,可以修改vs的选项:

 

windows下,编译c++版本的tensorflow(cpu版本)

②若编译debug版本,则选择debug;平台选择x64

windows下,编译c++版本的tensorflow(cpu版本)

③选中ALL_BUILD,右键点击生成

如果这个过程当中没有报任何错的话,就说明我们已经成功编译好了,打开文件夹tensorflow1.3/tensorflow/contrib/cmake/build/debug,会出现tensorflow.dll,tensorflow.lib,tensorflow.pdb

windows下,编译c++版本的tensorflow(cpu版本)

 

如果真的是这样顺利的话,那真的是皆大欢喜啊,可是事实上真的会这么顺利吗?答案很明显不是的,那么我们都会遇到哪些错误呢?请看下文:

三、编译过程中出现的错误

1.re2引起的错误

解决方案:

 ①转到到你的tensorflow文件里tensorflow-1.3.0\tensorflow\contrib\cmake\build\re2\src\re2目录下。

删除该目录下的非文件夹的文件,除了CmakeList.txt保留。

windows下,编译c++版本的tensorflow(cpu版本)

          

 ②打开cmake-gui,如下图所示配置,单独重新配置re2工程。

windows下,编译c++版本的tensorflow(cpu版本)

然后点击Configure,Configure done之后:

记得Ungrouped Entries下的RE2_BUILD_TESTING取消勾选

    BUILD下的BUILD_TESTING取消勾选

windows下,编译c++版本的tensorflow(cpu版本)

 然后再次点击configure -> generate

 Generate成功之后,不需要点击按钮 open project

直接在之前编译出错的解决方案里面,选中re2项目,右击生成按钮,这一步不出意外的话 就生成成功了。

 

2. 解决由于网速或者离线模式下相关文件不能下载而导致的失败问题

①比如说png工程编译失败

  报错:downloading "htpps://storage.gooleapis.com/libpng-public-archive/libpng-1.2.53.tar.gz' failed

   这是因为这个网址是外网,需要*才能下载,所以可以先提前下载下来,也可以对vs设置代理,这样在编译的过程当中,就能够访问外网并下载所需要的资源了。不过具体怎么设置的我还没弄明白,只是知道可以这么做,大家可以尝试一下,如果有知道,欢迎给我留言。

  将下载下来的文件拷贝到你的build下面的dowloads目录下,比如说:

tensorflow-1.3.0\tensorflow\contrib\cmake\build\downloads文件夹下。

然后转到tensorflow-1.3.0\tensorflow\contrib\cmake\build\png\src\png-stamp文件夹下,把download-png.cmake里的东西清空,如下图所示:

windows下,编译c++版本的tensorflow(cpu版本)

windows下,编译c++版本的tensorflow(cpu版本)

对png工程重新仅生成该工程,编译成功。

       ②还有就是grpc编译失败的问题,有两个解决方案,一个就是类似于png的操作;还有一个就是我们可以暂时不编译它,因为目前来看可能用不上它。

3. 找不到python36_d.lib

参考博客:(http://blog.csdn.net/xihuaxi/article/details/62217011

4. LINK : fatal error LNK1181: 无法打开输入文件“\pywrap_tensorflow_internal.lib”

这是因为3个项目(_beam_search_ops ; _gru_ops ; _lstm_ops)的配置有问题

修改如下:

视图->其他窗口->属性管理器->连接器->常规->附加库目录->添加:$(SolutionDir)$(Configuration)

;

windows下,编译c++版本的tensorflow(cpu版本)

修改完成之后,单独编译这三个项目,然后重新编译ALL_BUILD即可。

 

四、最后再选中ALL_BUILD,点击右键生成。整个编译过程结束

五、测试例子

编译成功后我们可以用这些头文件以及tensorflow.lib/dll来编写自己的测试工程了。

1. 新建一个c++的空工程

头文件为TestTensorFlow.h内容如下:

#pragma once  //这一句防止重复include头文件

#define COMPILER_MSVC

#define NOMINMAX  //这一句防止max/min函数命名冲突

 

源文件为TestTensorFlow.cpp

#include "TestTensorFlow.h"

 

#include "tensorflow/cc/client/client_session.h"

#include "tensorflow/cc/ops/standard_ops.h"

#include "tensorflow/core/framework/tensor.h"

 

int main() {

       using namespace tensorflow;

       using namespace tensorflow::ops;

       Scope root = Scope::NewRootScope();

       // Matrix A = [3 2; -1 0]

       auto A = Const(root, { { 3.f, 2.f },{ -1.f, 0.f } });

       // Vector b = [3 5]

       auto b = Const(root, { { 3.f, 5.f } });

       // v = Ab^T

       auto v = MatMul(root.WithOpName("v"), A, b, MatMul::TransposeB(true));

       std::vector<Tensor> outputs;

       ClientSession session(root);

       // Run and fetch v

       TF_CHECK_OK(session.Run({ v }, &outputs));

       // Expect outputs[0] == [19; -3]

       LOG(INFO) << outputs[0].matrix<float>();

       return 0;

}

2. 右击项目→属性→配置属性→C/C++→常规→附加包含目录,输入如图所示的路径。  不要把third_party中的路径加进去,否则可能会出现 fatal error C1014: 包含文件太多 : 深度=1024

 

视图->其他窗口->属性管理器,出现下面的界面,如果是debug并且是64位的,则选中Microsoft.Cpp.x64.user,右击属性->vc++目录->包含目录

windows下,编译c++版本的tensorflow(cpu版本)

windows下,编译c++版本的tensorflow(cpu版本)

windows下,编译c++版本的tensorflow(cpu版本)

windows下,编译c++版本的tensorflow(cpu版本)

 

 

六、在vs中添加lib的方式:

参照博客:(https://www.cnblogs.com/dongsheng/p/4011145.html