首页 > 解决方案 > 如何在 Windows XP 32 位上构建 TensorFlow C++ 库

问题描述

我正在尝试为 Windows XP 构建 TensorFlow 的 C++ 库。虽然我已经能够在 Windows 10 上构建和使用它,但 32 位 XP 无法正常工作。背景:我正在开发一个从 tensorflow.dll 调用函数的 COM 模块。我的构建环境:

我用来构建 tensorflow.dll 的顺序是:

最后一步还涉及一些手工劳动,因为构建过程不会将 .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_ntopinet_pton.

关于如何构建 TensorFlow 使其不使用这两个函数的任何建议?

“停止使用 XP,它的旧且不再受支持”的 PS 建议在这里没有帮助。升级到 Windows 10 绝对是最后的手段,因为它会在测试该软件的设施中造成中断。

编辑1:

这两个函数inet_ptoninet_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

解决方案


将 tensorflow 移植到 windows xp 几乎是不可能的,因为:

  1. TF 的平台相关代码需要一些比 winxp 晚的 Windows API,例如线程池 API。这可能会通过使用第三方线程池库来绕过。

  2. 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 支持,祝你好运。


推荐阅读