windows下,编译c++版本的tensorflow(cpu版本)
花了整整一天的时间,终于编译好了c++版本的tensorflow,下面将给出我的整个编译过程,我只能说过程很艰辛,查了很多资料,不过最后总算是成功了,功夫不负有心人。下面将给我的编译过程:
参考博客:
https://blog.****.net/jiugeshao/article/details/79144438
https://www.jianshu.com/p/3549c8e9cc15
http://blog.****.net/xihuaxi/article/details/62217011
https://www.cnblogs.com/dongsheng/p/4011145.html
一、需要的工具
1.cmake-3.10.1 (下载链接:https://github.com/Kitware/CMake/releases)
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
先点击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的选项:
②若编译debug版本,则选择debug;平台选择x64
③选中ALL_BUILD,右键点击生成
如果这个过程当中没有报任何错的话,就说明我们已经成功编译好了,打开文件夹tensorflow1.3/tensorflow/contrib/cmake/build/debug,会出现tensorflow.dll,tensorflow.lib,tensorflow.pdb
如果真的是这样顺利的话,那真的是皆大欢喜啊,可是事实上真的会这么顺利吗?答案很明显不是的,那么我们都会遇到哪些错误呢?请看下文:
三、编译过程中出现的错误
1.re2引起的错误
解决方案:
①转到到你的tensorflow文件里tensorflow-1.3.0\tensorflow\contrib\cmake\build\re2\src\re2目录下。
删除该目录下的非文件夹的文件,除了CmakeList.txt保留。
②打开cmake-gui,如下图所示配置,单独重新配置re2工程。
然后点击Configure,Configure done之后:
记得Ungrouped Entries下的RE2_BUILD_TESTING取消勾选
BUILD下的BUILD_TESTING取消勾选
然后再次点击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里的东西清空,如下图所示:
对png工程重新仅生成该工程,编译成功。
②还有就是grpc编译失败的问题,有两个解决方案,一个就是类似于png的操作;还有一个就是我们可以暂时不编译它,因为目前来看可能用不上它。
3. 找不到python36_d.lib
参考博客:(http://blog.****.net/xihuaxi/article/details/62217011)
4. LINK : fatal error LNK1181: 无法打开输入文件“\pywrap_tensorflow_internal.lib”
这是因为3个项目(_beam_search_ops ; _gru_ops ; _lstm_ops)的配置有问题
修改如下:
视图->其他窗口->属性管理器->连接器->常规->附加库目录->添加:$(SolutionDir)$(Configuration)
;
修改完成之后,单独编译这三个项目,然后重新编译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++目录->包含目录
六、在vs中添加lib的方式: