心血來潮,想自己編譯一下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 ],再重新編譯一次,嗯,這下 滿意了!