Building Psycopg on Windows using MinGW
Posted by Daniele Varrazzo on June 5,2011
使用MinGW编译Psycopg2
佣工7001 2012.2
我使用了Giovanni Bajo封装的MinGW GCC binaries 分发版本。这个分发版为我们处理了很多细节。例如:把MinGW注册为Python的默认编译器,外加一些我根本不想知道的魔法, 因此它使得我的整个处理过程足够容易了。
首先,需要确认安装脚本setup.py 可以找到配置文件“pg_config”。目前的Psycopg版本有一个Bug,造成在Path环境变量中也不能找到这个配置文件。 这个bug 将在Psycopg 2.4.2版本中被修正。 在这儿之前的几个版本你将不得不在setup.cfg文件中指定pg_config的路径,或者使用“ --pg-config”这个命令行选项来给出:
python setup.py build_ext --pg-config=C:\path\to\pg_config.exe build
这个程序库需要libpq.dll的支持,因此在运行时这个动态连接库一定要可找到,比如在系统的path变量保护库的路径或者干脆复制到psycopg2的目录中来。“libpq.dll”本身还需要依赖于其他几个dll文件,这些dll都可以在Postgresql的bin目录中找到:libeay32.dll,ssleay32.dll和libintl-8.dll。这些文件都需要可以访问到。并且不幸的是,如果其中某个文件不能找到,你只能收到这样的错误:“ImportError: dll load Failed”。当然,这样的错误使用 dependency walker可以很容易的跟踪出来。
另一个你可能遇到的问题是基于Python 2.6或更新的Python版本来编译时:一些MinGW版本使用了过期的msvcr90.lib版本,这同样会造成这个让人摸不着头脑的错误信息“ImportError”。在这里,dependency walker这个工具同样管用,它会指出在msvcr90.lib中找不到函数“localtime”。这个bug在已被提出来,请见issue 3308。我的解决方案是下载新的MinGW 版本,使用新版本里面的libmsvcr90.a。
好了,虽然依旧依赖于很多动态连接库,到目前为止总算可以编译了。如果解决方案中可以把所有的依赖项都复制到软件包目录中,我将热泪盈眶了。。当然你还可以使用Jason的分发包 。他已经把libpq和openssl作为静态库包含在了psycopg分发包中,这可能是最易用的版本了。