如何在Windows XP 32位上构建TensorFlow C ++库

时间:2018-11-18 12:27:23

标签: tensorflow

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

  • Visual Studio 2017 15.7
  • CMake 3.11.1
  • TensorFlow 1.8
  • Windows 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
  • 修复CMake文件,以将* .proto文件转换为* .pb.h文件as described here
  • 配置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文件从第3部分依赖项复制到需要的位置。无论出于何种原因,一堆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以便不使用这两个功能的任何建议吗?

P.S。 “停止使用XP,已不再支持它的旧版本”的建议在这里无济于事。升级到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,提交SubmitThreadpoolWork等功能。看来我必须用其他东西代替它们,因为我在TensorFlow中看不到其他实现。

此外,我发现tensorflow\contrib\cmake\CMakeLists.txt强制_WIN32_WINNT=0x0A00,并且CXXFLAGS是使用错误的环境变量。至少将其更改为CMAKE_CXX_FLAGS会包含我的宏定义FWIW。

2 个答案:

答案 0 :(得分:2)

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

  1. TF的平台专用代码比winxp要求晚一些Windows API,例如线程池API。使用第三方线程池库可能会绕过这个问题。

  2. 作为TF核心部分的nsync,protobuf和eigen使用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支持,那么祝您好运。

答案 1 :(得分:0)

最后,我放弃了这是根本不可能的。甚至用Boost中的东西替换线程池功能也无济于事。如果其他人设法解决了这个问题,我会很乐意接受这作为答案,但是到目前为止,这似乎是不可能的。