在Windows 8上启用GPU安装Theano

15

我知道Theano在Windows 8.1上的支持仅处于实验阶段,但我想知道是否有人在解决我的问题方面运气不错。根据配置,我会出现三种不同类型的错误。我假设解决任何一个错误都能解决我的问题。

我已经使用WinPython 32位系统安装了Python,并使用MinGW按照这里所述进行了安装。我的.theanorc文件的内容如下:

[global]
openmp=False
device = gpu

[nvcc]
flags=-LC:\TheanoPython\python-2.7.6\libs
compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\

[blas]
ldflags = 

当我运行 import theano 时,错误如下:

nvcc fatal   : nvcc cannot find a supported version of Microsoft Visual Studio.
Only the versions 2010, 2012, and 2013 are supported

['nvcc', '-shared', '-g', '-O3', '--compiler-bindir', 'C:\\Program Files (x86)\\
Microsoft Visual Studio 10.0\\VC\\bin# flags=-m32 # we have this hard coded for
now', '-Xlinker', '/DEBUG', '-m32', '-Xcompiler', '-DCUDA_NDARRAY_CUH=d67f7c8a21
306c67152a70a88a837011,/Zi,/MD', '-IC:\\TheanoPython\\python-2.7.6\\lib\\site-pa
ckages\\theano\\sandbox\\cuda', '-IC:\\TheanoPython\\python-2.7.6\\lib\\site-pac
kages\\numpy\\core\\include', '-IC:\\TheanoPython\\python-2.7.6\\include', '-o',
 'C:\\Users\\Matej\\AppData\\Local\\Theano\\compiledir_Windows-8-6.2.9200-Intel6
4_Family_6_Model_60_Stepping_3_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray
.pyd', 'mod.cu', '-LC:\\TheanoPython\\python-2.7.6\\libs', '-LNone\\lib', '-LNon
e\\lib64', '-LC:\\TheanoPython\\python-2.7.6', '-lpython27', '-lcublas', '-lcuda
rt']
ERROR (theano.sandbox.cuda): Failed to compile cuda_ndarray.cu: ('nvcc return st
atus', 1, 'for cmd', 'nvcc -shared -g -O3 --compiler-bindir C:\\Program Files (x
86)\\Microsoft Visual Studio 10.0\\VC\\bin# flags=-m32 # we have this hard coded
 for now -Xlinker /DEBUG -m32 -Xcompiler -DCUDA_NDARRAY_CUH=d67f7c8a21306c67152a
70a88a837011,/Zi,/MD -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\thean
o\\sandbox\\cuda -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\numpy\\co
re\\include -IC:\\TheanoPython\\python-2.7.6\\include -o C:\\Users\\Matej\\AppDa
ta\\Local\\Theano\\compiledir_Windows-8-6.2.9200-Intel64_Family_6_Model_60_Stepp
ing_3_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray.pyd mod.cu -LC:\\TheanoP
ython\\python-2.7.6\\libs -LNone\\lib -LNone\\lib64 -LC:\\TheanoPython\\python-2
.7.6 -lpython27 -lcublas -lcudart')
WARNING (theano.sandbox.cuda): CUDA is installed, but device gpu is not availabl
e

我也使用已安装在我的系统上的Visual Studio 12.0进行了测试,出现了以下错误:

mod.cu
nvlink fatal   : Could not open input file 'C:/Users/Matej/AppData/Local/Temp/tm
pxft_00001b70_00000000-28_mod.obj'

['nvcc', '-shared', '-g', '-O3', '--compiler-bindir', 'C:\\Program Files (x86)\\
Microsoft Visual Studio 12.0\\VC\\bin\\', '-Xlinker', '/DEBUG', '-m32', '-Xcompi
ler', '-LC:\\TheanoPython\\python-2.7.6\\libs,-DCUDA_NDARRAY_CUH=d67f7c8a21306c6
7152a70a88a837011,/Zi,/MD', '-IC:\\TheanoPython\\python-2.7.6\\lib\\site-package
s\\theano\\sandbox\\cuda', '-IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages
\\numpy\\core\\include', '-IC:\\TheanoPython\\python-2.7.6\\include', '-o', 'C:\
\Users\\Matej\\AppData\\Local\\Theano\\compiledir_Windows-8-6.2.9200-Intel64_Fam
ily_6_Model_60_Stepping_3_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray.pyd'
, 'mod.cu', '-LC:\\TheanoPython\\python-2.7.6\\libs', '-LNone\\lib', '-LNone\\li
b64', '-LC:\\TheanoPython\\python-2.7.6', '-lpython27', '-lcublas', '-lcudart']
ERROR (theano.sandbox.cuda): Failed to compile cuda_ndarray.cu: ('nvcc return st
atus', 1, 'for cmd', 'nvcc -shared -g -O3 --compiler-bindir C:\\Program Files (x
86)\\Microsoft Visual Studio 12.0\\VC\\bin\\ -Xlinker /DEBUG -m32 -Xcompiler -LC
:\\TheanoPython\\python-2.7.6\\libs,-DCUDA_NDARRAY_CUH=d67f7c8a21306c67152a70a88
a837011,/Zi,/MD -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\theano\\sa
ndbox\\cuda -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\numpy\\core\\i
nclude -IC:\\TheanoPython\\python-2.7.6\\include -o C:\\Users\\Matej\\AppData\\L
ocal\\Theano\\compiledir_Windows-8-6.2.9200-Intel64_Family_6_Model_60_Stepping_3
_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray.pyd mod.cu -LC:\\TheanoPython
\\python-2.7.6\\libs -LNone\\lib -LNone\\lib64 -LC:\\TheanoPython\\python-2.7.6
-lpython27 -lcublas -lcudart')
WARNING (theano.sandbox.cuda): CUDA is installed, but device gpu is not availabl
e

在后一个错误中,出现了几个弹出窗口,询问我在错误抛出之前想如何打开(.res)文件。

cl.exe 存在于两个文件夹中(即VS 2010和VS 2013)。

最后,如果我将VS 2013设置为环境路径,并将.theanorc内容设置如下:

[global]
base_compiledir=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin
openmp=False
floatX = float32
device = gpu

[nvcc]
flags=-LC:\TheanoPython\python-2.7.6\libs
compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\

[blas]
ldflags = 

我收到了以下错误:

c:\theanopython\python-2.7.6\include\pymath.h(22): warning: dllexport/dllimport conflict with "round"
c:\program files\nvidia gpu computing toolkit\cuda\v6.5\include\math_functions.h(2455): here; dllimport/dllexport dropped

mod.cu(954): warning: statement is unreachable

mod.cu(1114): error: namespace "std" has no member "min"

mod.cu(1145): error: namespace "std" has no member "min"

mod.cu(1173): error: namespace "std" has no member "min"

mod.cu(1174): error: namespace "std" has no member "min"

mod.cu(1317): error: namespace "std" has no member "min"

mod.cu(1318): error: namespace "std" has no member "min"

mod.cu(1442): error: namespace "std" has no member "min"

mod.cu(1443): error: namespace "std" has no member "min"

mod.cu(1742): error: namespace "std" has no member "min"

mod.cu(1777): error: namespace "std" has no member "min"

mod.cu(1781): error: namespace "std" has no member "min"

mod.cu(1814): error: namespace "std" has no member "min"

mod.cu(1821): error: namespace "std" has no member "min"

mod.cu(1853): error: namespace "std" has no member "min"

mod.cu(1861): error: namespace "std" has no member "min"

mod.cu(1898): error: namespace "std" has no member "min"

mod.cu(1905): error: namespace "std" has no member "min"

mod.cu(1946): error: namespace "std" has no member "min"

mod.cu(1960): error: namespace "std" has no member "min"

mod.cu(3750): error: namespace "std" has no member "min"

mod.cu(3752): error: namespace "std" has no member "min"

mod.cu(3784): error: namespace "std" has no member "min"

mod.cu(3786): error: namespace "std" has no member "min"

mod.cu(3789): error: namespace "std" has no member "min"

mod.cu(3791): error: namespace "std" has no member "min"

mod.cu(3794): error: namespace "std" has no member "min"

mod.cu(3795): error: namespace "std" has no member "min"

mod.cu(3836): error: namespace "std" has no member "min"

mod.cu(3838): error: namespace "std" has no member "min"

mod.cu(4602): error: namespace "std" has no member "min"

mod.cu(4604): error: namespace "std" has no member "min"

31 errors detected in the compilation of "C:/Users/Matej/AppData/Local/Temp/tmpxft_00001d84_00000000-10_mod.cpp1.ii".
ERROR (theano.sandbox.cuda): Failed to compile cuda_ndarray.cu: ('nvcc return status', 2, 'for cmd', 'nvcc -shared -g -O3 -Xlinker /DEBUG -m32 -Xcompiler -DCUDA_NDARRAY_CUH=d67f7c8a21306c67152a70a88a837011,/Zi,/MD -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\theano\\sandbox\\cuda -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\numpy\\core\\include -IC:\\TheanoPython\\python-2.7.6\\include -o C:\\Users\\Matej\\AppData\\Local\\Theano\\compiledir_Windows-8-6.2.9200-Intel64_Family_6_Model_60_Stepping_3_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray.pyd mod.cu -LC:\\TheanoPython\\python-2.7.6\\libs -LNone\\lib -LNone\\lib64 -LC:\\TheanoPython\\python-2.7.6 -lpython27 -lcublas -lcudart')
ERROR:theano.sandbox.cuda:Failed to compile cuda_ndarray.cu: ('nvcc return status', 2, 'for cmd', 'nvcc -shared -g -O3 -Xlinker /DEBUG -m32 -Xcompiler -DCUDA_NDARRAY_CUH=d67f7c8a21306c67152a70a88a837011,/Zi,/MD -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\theano\\sandbox\\cuda -IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\numpy\\core\\include -IC:\\TheanoPython\\python-2.7.6\\include -o C:\\Users\\Matej\\AppData\\Local\\Theano\\compiledir_Windows-8-6.2.9200-Intel64_Family_6_Model_60_Stepping_3_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray.pyd mod.cu -LC:\\TheanoPython\\python-2.7.6\\libs -LNone\\lib -LNone\\lib64 -LC:\\TheanoPython\\python-2.7.6 -lpython27 -lcublas -lcudart')
mod.cu

['nvcc', '-shared', '-g', '-O3', '-Xlinker', '/DEBUG', '-m32', '-Xcompiler', '-DCUDA_NDARRAY_CUH=d67f7c8a21306c67152a70a88a837011,/Zi,/MD', '-IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\theano\\sandbox\\cuda', '-IC:\\TheanoPython\\python-2.7.6\\lib\\site-packages\\numpy\\core\\include', '-IC:\\TheanoPython\\python-2.7.6\\include', '-o', 'C:\\Users\\Matej\\AppData\\Local\\Theano\\compiledir_Windows-8-6.2.9200-Intel64_Family_6_Model_60_Stepping_3_GenuineIntel-2.7.6-32\\cuda_ndarray\\cuda_ndarray.pyd', 'mod.cu', '-LC:\\TheanoPython\\python-2.7.6\\libs', '-LNone\\lib', '-LNone\\lib64', '-LC:\\TheanoPython\\python-2.7.6', '-lpython27', '-lcublas', '-lcudart']

如果我在没有启用 GPU 选项的情况下运行 import theano,它会顺利运行。同样,CUDA 样例也可以正常运行。


我还在这里提供了如何在Windows上安装该工具的详细答案:http://stackoverflow.com/questions/42099814/clarification-on-a-neural-net-that-plays-snake/42144754#42144754 - devinbost
7个回答

30
Theano是一个用于机器学习应用的强大工具,但我发现它在Windows上的安装对于编程初学者(如我自己)来说并不容易。在我的情况下,当脚本在GPU上运行时,速度提高了5-6倍,所以这绝对值得花费一些功夫。本指南基于我的安装过程撰写,旨在详细说明,即使对于没有在Windows环境下构建程序的先前经验的人也能理解。本指南的大部分内容基于这些说明,但我必须更改一些步骤以使其适用于我的系统。如果我做的有什么不够优化或在您的计算机上无法正常工作,请告诉我,我会相应地修改本指南。
以下是我在Windows 8.1计算机上安装启用GPU的Theano时遵循的步骤:

CUDA安装

CUDA可以从这里下载。在我的情况下,我选择了64位笔记本电脑版本,配备Geforce 750m的NVIDIA Optimus。
通过从命令行启动deviceQuery来验证您的安装是否成功。在我的情况下,它位于以下文件夹中:C:\ProgramData\NVIDIA Corporation\CUDA Samples\v6.5\bin\win64\Release。如果成功,您应该在测试结束时看到PASS。

Visual Studio 2010安装

我通过dreamspark安装了这个软件。如果您是学生,则有资格获得免费版本。如果不是,您仍然可以安装Express版本,它应该同样适用。安装完成后,您应该能够从开始菜单调用Visual Studio命令提示符2010。

Python安装

在撰写本文时,Theano仅支持使用32位浮点数,并主要构建于Python 2.7版本之上。Theano需要大部分基础的科学Python库,例如scipynumpy。我发现最简单的安装方式是通过WinPython进行安装。它会在一个自包含的文件夹中安装所有依赖项,如果在安装过程中出现问题,可以轻松地重新安装,并且还可以免费获得一些有用的IDE工具,例如IPython笔记本和Spyder。为了方便使用,您可能希望将路径添加到您的python.exe和Scripts文件夹的环境变量中。

Git安装

找到这里

MinGW安装

设置文件在这里。在安装过程中,我选中了所有基础安装文件。如果您遇到下面描述的g++错误,则需要此安装。

Cygwin安装

您可以在这里找到它。我基本上只使用此实用程序来提取已在基础安装中提供的PyCUDA tar文件(因此安装应该很简单)。

Python distutils修复

打开位于Python安装的/lib/distutils/目录下的msvc9compiler.py。在我的情况下,第641行读取:ld_args.append('/IMPLIB:'+ implib_file)。在此行之后添加以下内容(相同缩进):
ld_args.append('/MANIFEST')

PyCUDA安装

PyCUDA的源代码可以在这里找到。

步骤:

打开cygwin并导航到PyCUDA文件夹(即/cygdrive/c/etc/etc),执行tar -xzf pycuda-2012.1.tar.gz

打开Visual Studio命令提示符2010,并导航到解压后的tarball所在目录,执行python configure.py

打开./siteconf.py文件并更改值,使其读取以下内容(例如CUDA 6.5):

BOOST_INC_DIR = []
BOOST_LIB_DIR = []
BOOST_COMPILER = 'gcc43'
USE_SHIPPED_BOOST = True
BOOST_PYTHON_LIBNAME = ['boost_python']
BOOST_THREAD_LIBNAME = ['boost_thread']
CUDA_TRACE = False
CUDA_ROOT = 'C:\\Program Files\\NVIDIA GPU Computing Toolkit\\CUDA\\v6.5'
CUDA_ENABLE_GL = False
CUDA_ENABLE_CURAND = True
CUDADRV_LIB_DIR = ['${CUDA_ROOT}/lib/Win32']
CUDADRV_LIBNAME = ['cuda']
CUDART_LIB_DIR = ['${CUDA_ROOT}/lib/Win32']
CUDART_LIBNAME = ['cudart']
CURAND_LIB_DIR = ['${CUDA_ROOT}/lib/Win32']
CURAND_LIBNAME = ['curand']
CXXFLAGS = ['/EHsc']
LDFLAGS = ['/FORCE']

在VS2010命令提示符中执行以下命令:

set VS90COMNTOOLS=%VS100COMNTOOLS%
python setup.py build
python setup.py install

创建这个Python文件并验证您是否获得了结果:
# from: http://documen.tician.de/pycuda/tutorial.html
import pycuda.gpuarray as gpuarray
import pycuda.driver as cuda
import pycuda.autoinit
import numpy
a_gpu = gpuarray.to_gpu(numpy.random.randn(4,4).astype(numpy.float32))
a_doubled = (2*a_gpu).get()
print a_doubled
print a_gpu

安装 Theano

打开 git bash shell,在您想要放置 Theano 安装文件的文件夹中执行以下命令:

git clone git://github.com/Theano/Theano.git
python setup.py install

请在VS2010命令提示符中打开Python并运行import theano
如果出现与g++相关的错误,请打开MinGW msys.bat(在我的情况下安装在此处:C:\MinGW\msys\1.0),并尝试在MinGW shell中导入theano。然后从VS2010命令提示符中重新导入theano,现在应该可以正常工作了。
在WordPad中创建一个文件(而不是记事本!),将其命名为.theanorc.txt,并将其放置在C:\Users\Your_Name\或任何其他用户文件夹所在位置:
#!sh
[global]
device = gpu
floatX = float32

[nvcc]
compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin
# flags=-m32 # we have this hard coded for now

[blas]
ldflags =
# ldflags = -lopenblas # placeholder for openblas support

创建一个测试Python脚本并运行它:
from theano import function, config, shared, sandbox
import theano.tensor as T
import numpy
import time

vlen = 10 * 30 * 768  # 10 x #cores x # threads per core
iters = 1000

rng = numpy.random.RandomState(22)
x = shared(numpy.asarray(rng.rand(vlen), config.floatX))
f = function([], T.exp(x))
print f.maker.fgraph.toposort()
t0 = time.time()
for i in xrange(iters):
    r = f()
t1 = time.time()
print 'Looping %d times took' % iters, t1 - t0, 'seconds'
print 'Result is', r
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]):
    print 'Used the cpu'
else:
    print 'Used the gpu'

确认你在最后使用了GPU,然后你就完成了!


1
这太棒了。非常感谢。 - brentlance
你能否提供以下路径的内容:C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\lib\Win32 和 C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.0\lib\x64?我在尝试在Windows上安装Theano时遇到了问题,所以我想问一下。例如,在Win32下我没有任何cublas.lib,但是在x64下有。你的情况也是这样吗? - morpheus
@Matt,CUDA 7不是硬性要求。但在我卸载7并安装6.5之前,你能和我分享一下你的lib\Win32文件夹的内容吗?它里面有cublas.lib吗? - morpheus
@Matt 非常感谢您提供的安装指南。我已经按照指南进行了操作,直到PyCUDA的安装。但是我使用的是CUDA 7.5和VS 2015(较旧的版本)。在执行python configure.py时,我遇到了两个异常:Could not build the egg.和文件distribute_setup.py中第144行的raise ImportError。您知道有什么解决方法吗?或者我可以为这个问题开一个新的线程讨论吗? - Matthias
@Matthias 根据这个错误报告,我不确定可能是什么原因。我建议为此问题提出单独的线程,因为构建egg失败可能与CUDA 7.5或PyCUDA安装无关。 - Matt
显示剩余8条评论

5
以下是在64位Windows 10机器上安装Theano的简单步骤。这些步骤已经在此处列出的代码上进行了测试。
(所有安装都采用默认安装路径)
1. 安装Anaconda Python 3.x发行版(它已经包含numpy、scipy、matlibplot等)。 2. 在命令行中运行'conda install mingw libpython'。 3. 从官方网站下载Theano并执行'python setup.py install'进行安装。 4. 安装最新的64位Windows 10 CUDA工具包(目前是7.5)。 5. 安装Visual Studio 2013(适用于Windows 10的免费版本)。 6. 在%USERPROFILE%路径下创建.theanorc.txt文件,并在其中添加以下内容以使用GPU运行Theano。
[global]
floatX = float32
device = gpu
[nvcc]
fastmath = True compiler_bindir=C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\cl.exe [cuda]
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5

2
嗨,我已经完成了所有操作,但是出现错误:ERROR (theano.sandbox.cuda): Failed to compile cuda_ndarray.cu: 我在这里发布了完整的错误信息:(https://groups.google.com/forum/#!topic/theano-users/WkjeeDRvmXo),你能帮帮我吗? - ishido

2

1
我意识到我的安装无法工作的原因是我的主板上的GPU已经损坏了(我收到了一台有故障的设备)。我以前看过这个指南,但我将在新配置中检查它是否有效。我会在实施后给你答案。 - Matt
我非常好奇安装的过程怎么样。请告诉我! - brentlance
@JohnnyStrings 我发布的答案是有效的。不过我有一段时间没有检查它了,所以我不确定这个答案是否仍然适用。 - Matt

0

我使用了这个指南,它非常有帮助。

许多Windows Theano指南只是顺便提到(或者根本没有提到)你需要从mingw shell编译theano,而不是从你的IDE中编译。

我运行了mingw-w64.bat,然后输入"python"和"import theano"。只有在那之后,从pycharm中导入才能正常工作。

此外,deeplearning.net上的官方说明很糟糕,因为它告诉你要使用CUDA 5.5,但它无法与更新的显卡一起使用。

评论也非常有帮助。如果它抱怨缺少crtdefs.h或basetsd.h,请按照Sunando的答案所说去做。如果在此之后仍然抱怨objbase.h中未定义标识符"Iunknown",请将以下内容插入C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include\objbase.h文件的第236行:

#include <wtypes.h>
#include <unknwn.h>

我必须完成最后一部分,以使其与最新的安装版本兼容(Keras 的某些部分需要)。

我还写了一个对我有用的事项清单,这里是链接: http://acoupleofrobots.com/everything/?p=2238 这是64位版本。


0

我可以通过在“C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5\bin\nvcc.profile”中添加所需的依赖项来编译cu文件。

我修改了包含路径和库路径,然后它开始工作了。

INCLUDES += “-I$(TOP)/include” $(SPACE) “-IC:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/include” $(SPACE) “-IC:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Include” $(SPACE) LIBRARIES =+ $(SPACE) “/LIBPATH:$(TOP)/lib/$(_WIN_PLATFORM_)” $(SPACE) “/LIBPATH:C:/Program Files (x86)/Microsoft Visual Studio 12.0/VC/lib/amd64” $(SPACE) “/LIBPATH:C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib\x64” $(SPACE)

我已经完整地记录了安装过程,希望这可以帮到你 https://planetanacreon.wordpress.com/2015/10/09/install-theano-on-windows-8-1-with-visual-studio-2013-cuda-7-5/


0
根据Matt的教程,我在使用nvcc时遇到了问题。 我需要在nvcc.profile中添加VS2010可执行文件的路径(您可以在cuda bin文件夹中找到它):
"compiler-bindir = C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64"

我认为我和你遇到了同样的问题。在构建和安装pycuda步骤之后,当我导入''import pycuda.autoinit''时,Python会崩溃。你能告诉我具体如何解决吗? - Jani

0
如果您想在Windows 8.1 x64上升级到MS Visual Studio 2012和CUDA 7,请查看此处的教程:

http://machinelearning.berlin/?p=383

只要你严格遵循它,它应该能够正常工作。

祝一切顺利

克里斯蒂安


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接