CPython 源码 - 如何构建 STATIC python26.lib?
我正在尝试用Cython把我的hello.pyx文件编译成一个exe文件。
第一步是用命令“cython --cplus --embed hello.pyx”把hello.pyx编译成hello.cpp文件。这里的Embed
选项是指生成一个包含Python解释器的main()函数
。我想创建一个没有任何依赖的独立exe。
在hello.cpp
中,我有一个#include "Python.h"
,所以我从这里下载Python源代码:http://www.python.org/download/releases/2.6.6/,选择Gzipped源代码压缩包(2.6.6)。我添加了包含目录,但出现了缺少Python26.lib的错误。所以我尝试编译它。默认的构建会生成python26.lib,但它只有200 KB,这不是一个静态库,当我尝试编译hello.cpp时,出现了缺少引用的错误。
在README中,我没有看到任何关于如何静态构建的有用说明。不过,我在网上找到了一个最新版本的Python的README文件(3.x),里面有一些关于静态构建的有用信息:
http://svn.python.org/projects/python/trunk/PCbuild/readme.txt
这个解决方案没有静态库的配置。不过,构建一个静态库而不是DLL是很简单的。你只需将“配置类型”设置为“静态库(.lib)”,并将预处理器宏“Py_ENABLE_SHARED”改为“Py_NO_ENABLE_SHARED”。你可能还需要将“运行库”从“多线程DLL(/MD)”改为“多线程(/MT)”。
但这里仍然没有太多细节,我是否需要将解决方案中的所有项目都设置为构建为静态库?还是只需要pythoncore?“Python”和“Pythonw”项目是“应用程序”,所以我只能将运行库改为/MT。以下是我正在做的步骤:
- 切换到“Release”模式。
- 项目“Python” - 设置
/MT
并添加预处理器定义Py_NO_ENABLE_SHARED
- 项目“Pythoncore” - 配置类型改为
静态库(.lib)
,/MT,将预处理器定义Py_ENABLE_SHARED
替换为Py_NO_ENABLE_SHARED
- 项目“Pythonw” - 和“Python”一样。
- 我右键点击“Python”进行构建。
构建总结:
构建:5个成功,1个失败,0个最新,0个跳过
kill_python (ok)
make_buildinfo (ok)
make_versioninfo (ok)
pythoncore (ok)
w9xpopen (ok)
python (4 errors)
失败的项目是“Python”,这是日志:
------ Build started: Project: python, Configuration: Release Win32 ------
Compiling...
python.c
Compiling resources...
Microsoft (R) Windows (R) Resource Compiler Version 6.1.7600.16385
Copyright (C) Microsoft Corporation. All rights reserved.
Linking...
pythoncore.lib(sysmodule.obj) : error LNK2019: unresolved external symbol __Py_svnversion referenced in function _svnversion_init
pythoncore.lib(getversion.obj) : error LNK2019: unresolved external symbol _Py_GetBuildInfo referenced in function _Py_GetVersion
pythoncore.lib(dynload_win.obj) : error LNK2019: unresolved external symbol __Py_DeactivateActCtx referenced in function __PyImport_GetDynLoadFunc
pythoncore.lib(dynload_win.obj) : error LNK2019: unresolved external symbol __Py_ActivateActCtx referenced in function __PyImport_GetDynLoadFunc
d:\python\src4\PCbuild\\python.exe : fatal error LNK1120: 4 unresolved externals
Build Time 0:02
我查看/PCbuild/目录,看到“pythoncore.lib”存在(10MB),但没有“python26.lib”。
当我在网上搜索这些错误时,只找到了一段在mail.pythong.org上的对话:http://www.groupsrv.com/computers/about397568.html
我尝试在pythoncore项目中删除预处理器定义“_USRDLL”,但错误依然相同。
pythoncore中的预处理器定义是:
_USRDLL
Py_BUILD_CORE
Py_NO_ENABLE_SHARED
WIN32
当我点击编辑时,我在另一个框中看到“继承值”,这些是:
NDEBUG
_WIN32
那个Ndebug很奇怪,因为我已经将模式改为Release。
我使用的是Visual Studio 2008(不是Express版),并安装了所有服务包。
顺便说一下,我之前尝试构建整个解决方案,但有一些关于缺少文件的错误,这些文件的路径以“../../dba-”开头。
我尝试编译2.6.2和2.6.6版本的Python,但它们都抛出了相同的错误:pythoncore.lib(sysmodule.obj) : error LNK2019: unresolved external symbol
1 个回答
我从Python 2.4到2.7一直在构建静态版本,确实需要花一些时间来设置。
你需要更新解决方案中所有启用项目的配置,把它们设置为 /MT。要构建Python的静态版本,它所引用的所有东西,包括像SQLite或OpenSSL这样的库,也必须是静态的。即使是.pyd模块也要这样处理,因为如果不这样做,它们在后面就无法被导入。
你可能还需要在Modules/socketmodule.h文件的顶部附近做一些修改:
#else /* MS_WINDOWS */
# define inet_pton _msvc_inet_pton
# define inet_ntop _msvc_inet_ntop
# include <winsock2.h>
# include <ws2tcpip.h>
# include <wspiapi.h>
# undef inet_pton
# undef inet_ntop
一旦你解决了最初的错误,还有一些其他的事情可能是必要的:
禁用嵌入清单的创建;可以查看distutils msvc9compiler.py文件中的大约第650行;即使在使用/MT构建时仍然创建这些清单是一个bug。
在distutils msvccompiler/msvc9compiler.py中把/MD改成/MT,否则第三方库将无法正确构建。