这几天由于工作需要,需要Windows上Python 2.7 x64对应的svn模块。Win32版本可以从这个页面直接下载 http://sourceforge.net/projects/win32svn
x64的无奈只有自己编译了。
在这个过程中还是费了一些力气,在Linux上可以直接make,在Windows使用Visual Studio来管理工程,不过有一些工程并没有及时更新,因此会遇到一些莫名其妙的问题。在这里就把这个过程中遇到的问题总结一下,将来可以省点力气。
一、 准备工作
1. 首先需要下一些代码。
名称 | 下载页面 | 当前版本 |
Subversion | http://subversion.apache.org/download/ | 1.8.8 |
apr | http://archive.apache.org/dist/apr/ | 1.5.0 |
apr-iconv | http://archive.apache.org/dist/apr/ | 1.2.1 |
apr-uti | http://archive.apache.org/dist/apr/ | 1.5.3 |
zlib | http://www.zlib.net/ | 1.2.8 |
sqlite-amalgamation | http://www.sqlite.org | 3080301 |
swigwin | http://sourceforge.net/projects/swig/files/swigwin/ | 2.0.12 |
注:apr, apr-iconv, apr-util 从同一个页面下载,一定要选择名字上带“-win32”的文件,如apr-1.5.0-win32-src.zip, apr-iconv-1.2.1-win32-src.zip, apr-util-1.5.3-win32-src.zip
2. 将上面的代码解压后放到同一个目录下面,如C:\Temp。如下面的样子:
目录名字上都删去了版本号,这样做有好处,下面会看到。
3. 编译apr, apr-iconv, apr-util. 进入apr-util的目录,双击aprutil.dsw,你用的Visual Studio版本应该比VC6更高,按照提示转换成对应版本的工程即可。
Apr-util这个工程已经把apr工程包括进来了,只要你目录的名字是“apr”并且“apr”和“apr-util”在同一级目录下面(就像上面看到的样子)。
完成之后,可以看到里面有27个工程,这些我们不必全部编译,按以下顺序执行。我们可以把工程配置选择为Release,平台选择为x64了。
(1) 编译aprutil(在工程上右键单击,选择“Build”),不应该遇到问题,生成5个文件:C:\Temp\apr\x64\LibR\apr-1.lib
C:\Temp\apr-util\xml\expat\lib\x64\LibR\xml.lib
C:\Temp\apr-iconv\x64\LibR\apriconv-1.lib
C:\Temp\apr\x64\LibR\aprapp-1.lib
C:\Temp\apr-util\x64\LibR\aprutil-1.lib
(2) 编译libaprutil(在工程上右键单击,选择“Build”)。此时有2个工程失败,分别是 libapriconv和libaprutil. 都是一堆链接错误,类似:
iconv_module.obj : error LNK2019: unresolved external symbol __imp_apr_stat referenced in function iconv_getpathname iconv_module.obj : error LNK2019: unresolved external symbol __imp_apr_snprintf referenced in function iconv_getpathname iconv_module.obj : error LNK2019: unresolved external symbol __imp_apr_pool_destroy referenced in function iconv_getpath
等等。
右键单击libapriconv,选择属性(Properties),在属性对话框中:
a) 选择 Configuration Properties -> C/C++ -> Preprocessor ,右侧的 Preprocessor Definitions 增加一个宏 APR_DECLARE_STATIC;
b) 选择 Configuration Properties -> Linker -> General,右侧的 Additional Library Directories增加一个路径 C:\Temp\apr\x64\LibR;
c) 选择 Configuration Properties -> Linker -> Input,右侧的 Additional Dependencies增加两个静态库 ws2_32.lib和apr-1.lib;
类似的,对libaprutil工程增加宏(API_DECLARE_STATIC, APR_DECLARE_STATIC),增加附加库路径(C:\Temp\apr\x64\LibR, C:\Temp\apr-util\xml\expat\lib\x64\LibR, C:\Temp\apr-iconv\x64\LibR, C:\Temp\apr-util\x64\LibR),增加附加库(Rpcrt4.lib, apr-1.lib, apriconv-1.lib, aprutil-1.lib, xml.lib)
(3) 对 libaprutil 重新编译即可。
(4) 为了方便subversion的使用,我们将编译好的*.lib文件放到Release目录下面。
a) 将 C:\Temp\apr\x64\Release\*.lib 放到 C:\Temp\apr\Release 下
b) 将 C:\Temp\apr-util\x64\Release\*.lib 放到 C:\Temp\apr-util\Release 下
c) 将 C:\Temp\apr-util\xml\expat\lib\x64\LibR\*.lib 放到 C:\Temp\apr-util\Release 下
d) 将 C:\Temp\apr-iconv\x64\Release\*.lib 放到 C:\Temp\apr-iconv\Release 下
4. 编译subversion,在这里我们需要的是swig python bindings(终于进入正题)。
(1) 进入 subversion 目录,运行下面的命令(目的是生成vcproj工程)
Python gen-make.py -t vcproj --vsnet-version=2010 --with-swig=C:\Temp\swigwin --with-zlib=C:\temp\zlib --with-apr=C:\Temp\apr --with-apr-util=C:\Temp\apr-util --with-apr-iconv=C:\Temp\apr-iconv --with-sqlite= C:\Temp\sqlite-amalgamation
注意--vsnet-version,填写你的Visual Studio的版本,这里我用的是2010. 其他的目录填写绝对路径。
(2) 在这个目录下面生成一个subversion_vcnet.sln,打开,将配置改为Release,平台改为x64。
5. 选择__SWIG_PYTHON__ 进行编译,共编译31个工程,全部成功。(如果libsvn_subr_dll和libsvn_delta_dll失败,是由于zlib编译非64位的版本,重新编译zlib即可。)
6. 至此,编译工作结束,下面可以把编译生成的文件复制出来了。我们假设放到C:\Temp\svnpy下面。
(1) 在svnpy下面新建目录svn,把C:\Temp\subversion\subversion\bindings\swig\python\svn下面的*.py文件都复制C:\Temp\svnpy\svn下面。
(2) 在svnpy下面新建目录libsvn,把C:\Temp\subversion\Release\subversion\bindings\swig\python 下面的*.pyd文件都复制到C:\Temp\svnpy\libsvn下面。
(3) 在C:\Temp\subversion\Release\subversion下搜索所有的.dll文件,都复制到C:\Temp\svnpy\libsvn下面。(共有9个,libsvn_client-1.dll, libsvn_delta-1.dll, libsvn_diff-1.dll, libsvn_fs-1.dll, libsvn_ra-1.dll, libsvn_repos-1.dll, libsvn_subr-1.dll, libsvn_swig_py-1.dll, libsvn_wc-1.dll)
(4) 把C:\Temp\subversion\subversion\bindings\swig\python下面所有的*.py文件都复制到C:\Temp\svnpy\libsvn下面。
(5) 把第3步编译生成的3个dll复制到C:\Temp\svnpy\libsvn(分别是libapr-1.dll, libapriconv-1.dll, libaprutil-1.dll,在对应的文件夹下面的x64\Release下面找就可以了)。
7. 测试一下,看是否可以被Python导入:
参考
Compiling Subversion Python bindings on Windows
http://www.lejordet.com/2009/03/compiling-subversion-python-bindings-on-windows/