CPython源代码 - 如何构建STATIC python26.lib?

时间:2011-11-19 13:54:09

标签: python compilation static-linking cython cpython

我正在尝试使用Cython将我的hello.pyx文件编译为exe。

第一步是使用命令“cython --cplus --embed hello.pyx”将hello.pyx编译成hello.cpp文件。 Embed选项意味着Generate a main() function that embeds the Python interpreter。我正在尝试创建一个没有依赖项的独立exe。

hello.cpp我有一个#include "Python.h",所以我从这里下载Python源:http://www.python.org/download/releases/2.6.6/,选择 Gzipped源tar球(2.6.6)。我添加了包含dir并获取有关缺少Python26.lib的错误。所以我想编译它。默认构建创建python26.lib,但它只有200 KB,这不是一个静态库,当尝试编译hello.cpp时我会错过引用错误。

在README中,我没有看到任何有关如何静态构建它的有用指令。但是,我用谷歌搜索了一个在线README文件,在trunk(3.x)中有最新版本的python,有一些关于静态构建的有用信息:

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。这些是我正在做的步骤:

  • 更改为“发布”模式。
  • 项目“Python” - 设置/MT并添加预处理器定义Py_NO_ENABLE_SHARED
  • 项目“Pythoncore” - 配置类型为Static library (.lib),/ MT,用Py_ENABLE_SHARED替换预处理器定义Py_NO_ENABLE_SHARED
  • Project“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。

我正在使用安装了所有Service Pack的Visual Studio 2008(而不是Express)。

顺便说一下。之前我尝试构建整个解决方案,但是有一些关于丢失文件的错误,其路径以:“../../ dba - ”开头。


我尝试编译2.6.2和2.6.6版本的Python,但它们都抛出相同的错误:pythoncore.lib(sysmodule.obj) : error LNK2019: unresolved external symbol

1 个答案:

答案 0 :(得分:2)

我一直在构建从2.4到2.7的Python静态,并且确实需要做一些工作。

您需要更新解决方案中所有已启用项目的配置,并将其设置为/ 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中的〜650行msvc9compiler.py;事实上即使用/ MT构建它也会产生这些错误。

  • 在distutils msvccompiler / msvc9compiler.py中将/ MD更改为/ MT,因为否则第三方库不能正确构建。