我正在尝试为Windows XP构建TensorFlow的C ++库。虽然我已经能够在Windows 10上构建和使用它,但是32位XP无法正常工作。背景:我正在开发一个从tensorflow.dll调用功能的COM模块。我的构建环境:
我用来构建tensorflow.dll的顺序是:
set CXXFLAGS=/D_WINVER=0x0501 /D_WIN32_WINNT=0x0501
set PATH=%PATH%;C:\Program Files (x86)\Git\bin
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_ntop
和inet_pton
。
关于如何构建TensorFlow以便不使用这两个功能的任何建议吗?
P.S。 “停止使用XP,已不再支持它的旧版本”的建议在这里无济于事。升级到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
,提交SubmitThreadpoolWork
等功能。看来我必须用其他东西代替它们,因为我在TensorFlow中看不到其他实现。
此外,我发现tensorflow\contrib\cmake\CMakeLists.txt
强制_WIN32_WINNT=0x0A00
,并且CXXFLAGS
是使用错误的环境变量。至少将其更改为CMAKE_CXX_FLAGS
会包含我的宏定义FWIW。
答案 0 :(得分:2)
将tensorflow移植到Windows XP几乎是不可能的,因为:
TF的平台专用代码比winxp要求晚一些Windows API,例如线程池API。使用第三方线程池库可能会绕过这个问题。
作为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中的东西替换线程池功能也无济于事。如果其他人设法解决了这个问题,我会很乐意接受这作为答案,但是到目前为止,这似乎是不可能的。