在windows系统上编译tensorflow
写在前面:时隔两天,终于成功编译tensorflow的c++接口。熟悉了cmake的使用方法,接触了powershell,chocolatey,bazel,tensorflow的各个版本源代码,swigwin-3.0.12,收获很大。这里面最大的坑就是tensorflow和编译工具的版本匹配问题,有的时候很多问题原本简单,版本不匹配就会出现很多莫名其妙的问题。
1.准备工作
- tensorflow源代码 github网址
- cmake 下载地址
- swigwin-3.0.12 下载地址
- Git 下载地址
- visual studio 2015 下载地址
- cuda8.0和cudnnv5.1(可选项)
这里注意一下,安装工具的方法不同,用安装包最好,没有的话记得要添加环境变量
2.编译过程
2.1 利用cmake-gui 生成sln工程项目
- 在源码的tensorflow/contrib/cmake目录下创建build文件夹以存放编译结果文件
- 打开cmake-gui,配置文件路径
- 执行cinfigure(若上述准备工具的环境变量适配好的话,这里一般没有问题,否则检查一下)
- 对tensorflow中的文件进行勾选,再执行Generate,如下图所示
这里记录一下vs版本的问题。
最开始我的电脑里只有vs2013和vs2017,并没有vs2015,分别用13和17两个版本尝试过,虽然网上也有相关资料,或许有成功的,但我在用13和17两个版本测试的时候,发现13可以利用cmake成功configure和generate,但后面编译sln的时候会出现很多不可描述的错误,而对17版本的测试直接挂在了generate上,所以如果有条件的话,还是用vs2015比较好,tensorflow的官方文档也明确指出了vs的版本;另外,即便使用了vs2015,也最好下载一个update3补丁,后面在编译的时候有个别错误是由于15的版本问题,使用update3可以轻松搞定。
2.2 编译工程,生成dll和lib
- 用vs2015打开build子目录下的tensorflow.sln,编译环境会对项目自动进行几秒钟的加载,然后把编译模式调整为 release 和 x64(debug模式会非常严格)然后可以开始进行编译
- 一般编译时间都会比较长,看个人配置,我这里编译一次的时间大概在2h左右
- 实践后可以看到编译结束后会根据不同的情况出现各种各样的错误(下面会对出现的常见错误进行一个整理),当我们使用各种方法解决问题后,会在build的目录下生成tensorflow.dll和tensorflow.lib文件,这就是我们的目标链接库了。
2.3 编译过程中出现的各种错误及解决方法
网上有关c++接口的tensorflow在windows系统下的编译过程的博文和文档基本都收录在了这篇文章里,解决这些问题还挺费劲的,但回过头来整理后发现,问题的种类比较集中,主要有以下几种
- LINK : fatal error LNK1181: 无法打开输入文件“\pywrap_tensorflow_internal.lib”
问题的解决方法是配置工程中前三个项目的附加库,具体方法是:
修改这三个项目的配置项,
_beam_search_ops
_gru_ops
_lstm_ops
配置属性 -> 连接器 -> 常规 -> 附加库目录 ->添加:
$(SolutionDir)$(Configuration);
-
re2项目编译无法通过
这个问题在这篇文章中提到的一种解决方法是跳过对该项目的编译过程;另一种成功的解决方法是把电脑的区域和语言改成美国和英语,在win10系统下更改设置后需要进行重新启动。修改以后这个问题得到解决,但编译时原来报错的test文件会出现乱码(其实是编码问题),无需理会。
-
error C2064: 项不会计算为接受 0 个参数的函数
这种错误应该比较少,如果出现的话,解决方法是对vs2015用update3补丁更新以下。我的vs版本原本是15update3,但保险起见我还是用补丁修正了一次。
-
version_info.cc not being generated on windows
实际上我没有遇到这个问题,相关的解决办法详见另一篇对参考资料的整理。
扫描二维码关注公众号,回复: 5647717 查看本文章 -
堆内存不足error 1002 Faltal Error "compiler is out of heap space"
这个问题最常见,只需要在不断解决其他错误的基础上,反复对工程进行编译,2-3次编译后这个问题就没有了。
2.4 其他需要注意的问题
- 最好在编译过程中保持能访问外网
- 以管理员身份运行visual studio
- 安装cmake, git等工具的时候记得要把环境变量配置好,如果没配置好,在使用cmake-gui的时候就会弹窗报错
差不多就是这些了,总结了自己最近几天以来踩过的坑,时常反省,继续探索。