# bulid_tensorflow_cc_on_windows **Repository Path**: se7enXF/bulid_tensorflow_on_windows ## Basic Information - **Project Name**: bulid_tensorflow_cc_on_windows - **Description**: 在Windows上编译tensorflow1.14.1的c++API - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-06-29 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Bulid tensorflow c++ API on windows 在 Windows 上编译 tensorflow-gpu-1.14.1 的 c++ API, CUDA 10.0 + cuDNN 7.6 ## 第一步:环境配置 根据 [tensorflow 官网](https://tensorflow.google.cn/install/source_windows)配置开发环境 1. 安装python3.6 ,然后打开 `cmd.exe` 安装 tensorflow 依赖 `pip install six numpy wheel` `pip install keras_applications==1.0.6 --no-deps` `pip install keras_preprocessing==1.0.5 --no-deps` 2. 安装 Bazel 查看[经过测试的构建配置](https://tensorflow.google.cn/install/source_windows#tested_build_configurations) ,下载对应版本的 Bazel,此处版本为 0.25.2 。 3. 安装 MSYS2 * 下载 MSYS2 并安装到`C:\msys64`下,将`C:\msys64\usr\bin`添加到系统PATH,拷贝 Bazel 到 `C:\msys64\usr\bin` 并 且重命名为`bazel.exe`。 * 打开`cmd.exe`并运行命令`pacman -S git patch unzip`安装必要软件。 4. 安装 Visual Studio 2017 (或2015) 5. 安装 CUDA 10.0 和 对应的 cuDNN 7.6 ## 第二步:下载源码和配置 6. 下载tensorflow源码 * 可以按照 [ tensorflow 官方办法](https://tensorflow.google.cn/install/source_windows#download_the_tensorflow_source_code) 下载和切换本版。 * 也可以通过[码云镜像](https://gitee.com/mirrors/tensorflow/tree/r1.14/)直接下载,然后解压。 * 为了方便后续操作,重命解压后的文件夹为`source`,源码组织如下: `source/tensorflow/...` `source/third_party/...` `source/tools/...` `...` 7. 配置build * 在`source`下打开命令行,运行`python configure.py`。 * 根据提示配置。 ## 第三步:编译 8. 编译 dll `bazel build --config=cuda tensorflow:tensorflow_cc.dll` 9. 编译 lib `bazel build --config=cuda tensorflow:tensorflow_cc.lib` 10. 生成所需头文件 `bazel build --config=cuda tensorflow:install_headers` 11. 生成文件目录 * tensorflow_cc.dll 和 tensorflow_cc.lib 在`source\bazel-genfiles\tensorflow`下。 * 头文件在`source\bazel-genfiles\tensorflow\include`目录,其中的`src`和`absl`目录,在工程 include dir 中要单独包含。 12. 调用 dll 并 解决一些问题 * 问题1:无法解析的外部符号 用记事本打开`source\tensorflow\tools\def_file_filter\def_file_filter.py.tpl`,找到123行,修改如下: ```python # Header for the def file. if args.target: def_fp.write("LIBRARY " + args.target + "\n") def_fp.write("EXPORTS\n") def_fp.write("\t ??1OpDef@tensorflow@@UEAA@XZ\n") ##############这里是加入的内容################### # 格式为 def_fp.write("\t [这里写无法解析的外部符号错误的最后括号里以问号开头的内容]\n") def_fp.write("\t ??0SessionOptions@tensorflow@@QEAA@XZ\n") def_fp.write("\t ?NewSession@tensorflow@@YA?AVStatus@1@AEBUSessionOptions@1@PEAPEAVSession@1@@Z\n") ``` 保存后重新编译dll和lib。 * 问题2:右边的非法标记"::" 问题原因:Windows定义的min,max函数和tensorflow定义的冲突了 解决方法1(推荐):在工程入口文件开头加入`#define NOMINMAX` 解决方法2:打开错误的头文件,错误位置都是类似`std::...::max()`,在`std`左侧加入一个左括号,在`max`右侧加入一个右括号。 例如: ```c++ std::numeric_limits::max())) 改为: (std::numeric_limits::max)())) std::numeric_limits<::google::protobuf::int32>::min() 改为: (std::numeric_limits<::google::protobuf::int32>::min)() ```