心血来潮,想自己编译一下MySQLdb。
首先是要配置一个编译环境。我的操作系统是Windows XP SP2,Python 2.5.1。因为Python是直接从python.org下载的二进制版本,这个版本是用VC2003(VC7.1)编译,所以相应的python extension都需要用这个版本的VC编译(也可以用mingw,但是可能会有些问题,因为mingw使用的是msvcrt.dll,而Python 2.5用的是msvcrt71.dll,据说需要修改mingw下一个specs文件,不是很明白)。如果你直接安装了Visual Studio .NET 2003,那就很简单了。但是如果你机器上装的不是这个版本的VC,或者只装了VC ToolKit 2003,那就需要自己做些事情了。具体可以参考我上篇文章里收录的两个链接。
接下来记录一下安装MySQLdb的过程。先从http://sourceforge.net/projects/mysql-python下载MySQLdb的源代码,我下载的是1.22版本的。另外,安装的时候需要MySQL的头文件和库文件,我的机器已经安装了5.1.22版本的MySQL。把MySQLdb的代码解压后,进入相应的目录,执行python setuo.py install,然后...出错了。看了一下错误信息:WindowsError: [Error 2],这是一个Windows系统的错误代码,执行net helpmsg 2,查看代号2的错误是:系统找不到指定的文件。在看Python的错误信息,应该是在打开注册表的时候没找到对应的键值。查了一下代码,原来在site.cfg这个配置文件里有这样一行:registry_key = SOFTWARE/MySQL AB/MySQL Server 5.0,改成registry_key = SOFTWARE/MySQL AB/MySQL Server 5.1,再build一次,嗯,果然往下走了。不过,接着抛出一串VC的编译错误,大致是这样的:
D:/Program Files/Microsoft Platform SDK for Windows XP SP2/Include/WinSock2.h(2178) : error C2375: 'getservbyname' : redefinition; different linkage D:/Program Files/Microsoft Platform SDK for Windows XP SP2/Include/WinSock.h(867) : see declaration of 'getservbyname'
这个错误我熟悉啊,呵呵。肯定是在程序里混合使用了winsock.h和winsock2.h。我查了一下_mysql.c,发现有这么两行:
#include <windows.h>
#include <config-win.h>
windows.h是Platform SDK里的一个头文件,这个文件会包含winsock.h,而config-win.h,这个文件是MySQL的一个头文件,MySQL 5.1的这个文件会包含winsock2.h(呵呵,估计5.0以前的MySQL包含的也是winsock.h,回头我查一下),所以编译的时候就乱套了。
接下来就简单了,我把config-win.h的#include <winsock2.h>改成#include <winsock.h>,再编译,就OK了!
不过我觉得改MySQL的文件不太爽,决定还是恢复回去,把_mysql.h里#include <windows.h>这行注释掉,再一编译,嗯,也OK了。这样还是不完美的,屏幕上的信息显示,链接的时候用的还是winsock的库文件wsock32.lib。对于我这样一个处女座的人,还是要继续的:)
再检查一下代码,在setup_windows.py里,把libraries = [ 'kernel32', 'advapi32', 'wsock32', client ]改成libraries = [ 'kernel32', 'advapi32', 'ws2_32', client ],再重新编译一次,嗯,这下 满意了!