tensorflow - 如何在 Windows XP 32 位上构建 TensorFlow C++ 库
问题描述
我正在尝试为 Windows XP 构建 TensorFlow 的 C++ 库。虽然我已经能够在 Windows 10 上构建和使用它,但 32 位 XP 无法正常工作。背景:我正在开发一个从 tensorflow.dll 调用函数的 COM 模块。我的构建环境:
- 视觉工作室 2017 15.7
- CMake 3.11.1
- TensorFlow 1.8
- 视窗 10
我用来构建 tensorflow.dll 的顺序是:
- 打开“VS 2017 的 x64_x86 交叉工具命令提示符”
- 尝试强制使用 Win XP 中可用的函数:
set CXXFLAGS=/D_WINVER=0x0501 /D_WIN32_WINNT=0x0501
- 将 Git 添加到路径:
set PATH=%PATH%;C:\Program Files (x86)\Git\bin
- 修复用于将 *.proto 文件转换为 *.pb.h 文件的 CMake 文件,如此处所述。
- 配置 CMake:
cmake .. -A Win32 -T v141_xp,host=x64 -DCMAKE_SYSTEM_VERSION=7.0 -DCMAKE_BUILD_TYPE=Release -DPYTHON_EXECUTABLE=C:\Users\williams\AppData\Local\Continuum\Anaconda3\envs\tensorflow\python.exe -Dtensorflow_BUILD_SHARED_LIB=ON -Dtensorflow_BUILD_PYTHON_BINDINGS=OFF -Dtensorflow_WIN_CPU_SIMD_OPTIONS="/arch:IA32"
- 建造:
cmake --build . --target tensorflow --config Release -- /fileLogger /m:1 /p:CL_MPCount=1
最后一步还涉及一些手工劳动,因为构建过程不会将 .lib 文件从第三部分依赖项复制到需要它们的位置。无论出于何种原因,一堆 INSTALL 项目永远不会运行,因此每次构建失败时我都必须手动执行此操作,同时查找丢失的 lib 文件。完成后,构建成功完成。
接下来,我将我的 COM 模块(一个 DLL)和 TensorFlow DLL 复制到 Windows XP 虚拟机上进行测试并尝试注册 COM 模块,但出现错误LoadLibrary("MyDLL.dll") - The specified procedure could not be found
。我不知道它在寻找什么程序,所以我能提供的最好的方法是 Dependency Walker 突出显示 WS2_32.DLL 并告诉我它找不到inet_ntop
和inet_pton
.
关于如何构建 TensorFlow 使其不使用这两个函数的任何建议?
“停止使用 XP,它的旧且不再受支持”的 PS 建议在这里没有帮助。升级到 Windows 10 绝对是最后的手段,因为它会在测试该软件的设施中造成中断。
编辑1:
这两个函数inet_pton
仅inet_ntop
在一个文件中使用,该文件构成 TensorFlow 中 Google Cloud Storage 支持的一部分。除了 tensorflow.dll 之外,构建过程还生成了一个 tensorflow_static.lib。链接静态版本并添加一些未包含在 tensorflow_static.lib 中的依赖项摆脱了使用inet_*
函数的代码。
我的 COM 模块仍然无法在 Windows XP 上运行,因为该文件tensorflow\core\platform\windows\env.cc
使用了仅在 Windows Vista 中引入的函数CloseThreadpoolWork
,如 submitSubmitThreadpoolWork
等。看起来我必须用其他东西替换它们,因为我在 TensorFlow 中看不到替代实现。
此外,我发现tensorflow\contrib\cmake\CMakeLists.txt
强制_WIN32_WINNT=0x0A00
使用CXXFLAGS
了错误的环境变量。将其更改CMAKE_CXX_FLAGS
为至少包含我的宏定义,FWIW。
解决方案
将 tensorflow 移植到 windows xp 几乎是不可能的,因为:
TF 的平台相关代码需要一些比 winxp 晚的 Windows API,例如线程池 API。这可能会通过使用第三方线程池库来绕过。
nsync、protobuf 和 eigen 是 TF 的核心部分,使用 C++11 thread_local,这使得它们无法作为 dll 运行时加载,请参阅https://docs.microsoft.com/en-us/cpp/ parallel/thread-local-storage-tls?view=vs-2017了解详情。这个后期特性理论上可以被旧的windows TLS API替代,这需要对TF的核心框架进行很多修改。
无论如何,如果你真的需要 xp 支持,祝你好运。
推荐阅读
- vagrant - Vagrant dev 构建抛出错误
- python - 我找不到这个元素(facebook_bot)
- mongodb - 如何使用聚合管道来查看哪些文档的字段具有以列表中的任何字符串开头的字符串?
- r - 如何让 rhandsontable 对输入值的变化和自身的变化做出反应?
- java - App Engine 部署失败 - 最大文件大小?
- laravel - 如何在用户对象中显示所有产品属性
- javascript - 如何使用我们从 jquery 获得的数据,然后在带有 for 循环的 var 中使用它?
- reactjs - 从包含多封电子邮件的字符串中提取电子邮件?
- python - 接收特定消息时如何使用 SkPy 发送特定消息
- unix - 有没有办法在单管道命令链中以有效的方式组合以下两个 UNIX 命令?