2008年7月25日星期五

Windows如何编译python 2.4的pyd模块

今天试图安装envisage,但它提供的最新版本都是为python 2.5提供的,于是我下载了源代码来自己编译,结果enthought.traits这个包里面有个pyd动态库,需要编译。

执 行python setup.py install,它先说找不到gcc,我把gcc-mingw的位置加到PATH中,但编译无法通过,链接是有一大堆的_imp_Pyxxxxx找不到。 看这个前缀,好像是Microsoft Visual C++编译器的习惯,而Windows上的python官方版一向都是用msvc编译的(不知道他们怎么不用gcc)。

总不至于要我安装 一个Visual Studio吧,而且python 2.4是用VS.NET 2003编译的(sys.version里面显示编译器版本为v.1310)。在网上找了半天,找到一个Visual C++ 2003 toolkit(微软已经不再提供下载,各位得仔细找找)。

但还是折腾了半天才搞定,方法如下:
1. 安装Visual C++ 2003 toolkit, 它只包含编译、链接工具,以及基本的C/C++库。
2. 安装Platform SDK (用gcc-mingw的库和头文件也可以)
3. 修改distutils/distutils.cfg,将编译器由mingw改为msvc (好像是上次安装gcc-mingw时它设置的,不过我用gcc-mingw一直没成功编译)
4. 修改distutils/msvccompiler.py,将MacroExpander.load_macros()里面对dotNet Framework的检测代码删掉(有必要检查这个么,奇怪); 然后仿照Python 2.5的做法修改MSVCCompiler.initialize(),改成如下(Python 2.5里面那个对MSSDK环境变量的检查也是没有必要的)

def initialize(self):
self.__paths = []
if os.environ.has_key("DISTUTILS_USE_SDK") and self.find_exe("cl.exe"):
# Assume that the SDK set up everything alright; don't try to be
# smarter
self.cc = "cl.exe"
self.linker = "link.exe"
self.lib = "lib.exe"
self.rc = "rc.exe"
self.mc = "mc.exe"
else:
//原来的老代码
6. 启动vc2003 toolkit的Command Prompt,然后按如下方式编译

set MSSDK=Platform SDK或者gcc-mingw的安装目录
set include=%INCLUDE%%MSSDK%include
set lib=%LIB%%MSSDK%lib
python setup.py install

没有评论: