banner.gif adie's blog
主页 博客 胭脂泪,相留醉,几时重,自是人生长恨水长东
统计
日志总数: 127
评论总数: 123
日志分类
日志归档
最近日志
最近评论
订阅
rss2.gif

atom.gif

google_rss
yc.gif 【技术资料】 阅读 8631 次

定制 Python 嵌入 C++: (二) 编译 Python 源代码 (win32, VC8)

2011-06-26 11:33:04

Python 的标准库内置了许多功能, 要完整的编译, 还需要一些第三方的开源代码. 下载的 Python 源代码包中并不包含这些第三方库, 需要手动下载. 在 Python 2.7.2 中用到的第三方开源代码及其版本如下:

  1. SQLite 3.6.21:  一个小型的嵌入式关系数据库, 官方网站 http://www.sqlite.org/. 编译 python 需要使用其合并的版本, 下载地址: http://www.sqlite.org/sqlite-amalgamation-3_6_21.zip
  2. Bzip 2-1.0.5: 一个数据压缩库, 官方网站 http://www.bzip.org/.  下载地址: http://www.bzip.org/1.0.5/bzip2-1.0.5.tar.gz 
  3. Berkeley DB 4.7.25:  一个高性能的嵌入式键值数据库, 已被 Oracle 收购. 下载地址: http://download.oracle.com/berkeley-db/db-4.7.25.tar.gz 
以上代码下载后需要解压到和 Python 2.7.2 相同的目录, 其结构如下图所示:



然后进入 Python-2.7.2/PC/VS8.0 目录, 双击 pcbuild.sln 打开解决方案即可看到所有的项目. 如果这时进行编译, 会发现还有一些模块无法编译, 这需要一些开发包的支持. 如果不需要这些功能, 也可以不下载这些包, 编译的时候不编译对应的模块. 这些开发包包括:
  1. Tcl/TK 8.5: 跨平台界面库. 官方网站 http://www.tcl.tk. 编译 _tkinter 模块需要.
  2. OpenSSL: 开源 SSL 链接实现. 官方网站 http://www.openssl.org.  编译 _ssl, _hashlib 模块需要.
  3. Windows Platform SDK (选择自己的操作系统对应的). 需要使用里面的 msi.lib. 编译 _msi 模块需要.
要编译以上内容, 还需要其它工具的支持. 这些工具包括 ActivePerl, nasm 等, 可以直接搜索下载. 

1. 编译 OpenSSL

    从 http://www.openssl.org/source/ 下载 OpenSSL 的源代码 openssl-0.9.8l.tar.gz, 注意版本号需要为 0.9.8l . 解压后将其和 python-2.7.2  放到同一个目录. 编译 _ssl 或 _hashlib 模块, 如果出现类似以下错误提示

>Can not find a suitable PERL:
> the following perl interpreters were found:
>(' ', 'C:\\Perl\\bin\\perl.exe')
>(' ', 'C:\\perl\\bin\\perl.exe')
> None of these versions appear suitable for building OpenSSL
> Please install ActivePerl and ensure it appears on your path
>No Perl installation was found. Existing Makefiles are used.

可修改 Python-2.7.2/PC/VS8.0/build_ssl.py 文件,  注释掉如下两行:

#        if rc:
#            continue

即可. 
如果还出现 

#error :  MDC2 is disabled.
#error :  IDEA is disabled.

之类的错误,  可直接在对应报错的头文件中加入

#undef OPENSSL_NO_MDC2
#undef OPENSSL_NO_IDEA

等宏定义.
   等 OpenSSL 编译完成后 _ssl, _hashlib 两个模块都可以编译了.

2. 编译 _msi

    安装完 Windows SDK 后将其 lib 路径加入到 VC 的 lib 目录表中, 重新编译 _msi 模块. 如果编译出现 debugging information corrupt; recompile module 错误, 可在 VC
 的 lib 路径设置中将 SDK 的路径移到最后. 或者去掉 SDK 路径, 只拷贝 msi.lib 文件到 VC 安装目录下的 lib 路径中.

3. 编译 TCL/TK

    TCL/TK 编译比较麻烦, 可以直接下载编译好的版本. 通过 SVN 从 http://svn.slicer.org/Slicer3-lib-mirrors/trunk/Binaries/Windows/tcl85-build/ 下载后把目录名改为 tcltk , 并和 Python-2.7.2 放在同一个目录下. 再次编译 _tkinter 模块即可.

至此, Python 源代码项目中的所有工程应该已经可以成功编译了!


其中有一个被配置为跳过的工程为 bdist_wininst, 这个工程是用于构建 Windows 的 Python 安装包的, 不属于 python 解释器, 也不是 python 的模块.
最后, 我们需要测试一下编译的结果, 编译后的可执行文件都放在了解决方案目录下, 即 Python-2.7.2/PC/VS8.0 中.  要执行测试, 我们从命令行下进入这个目录, 执行以下命令:

.\python.exe ..\testpy.py

然后就可以看到测试的结果:



最后这里将成功编译的所有源代码整理了一下, 去掉了一些无用的文件后一起打包, 以方便下载:

Python_Src_Build_VC8.zip

注意里面只包含了 VC8 的工程文件, 其余的都已经被删除了.

 





▲评论

X 正在回复:
姓 名: 留下更多信息
性 别:
邮 件:
主 页:
Q Q:
来 自:
职 业:
评 论:
验 证:


Valid HTML 4.01 Strict Valid CSS!
Copyleft.A!die Software Studio.ADSS
Power by webmaster@adintr.com