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

Cza*_*zak 5 python cpython compilation cython static-linking

我正在尝试使用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/,选择Gzip压缩源焦油球(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.这些是我正在做的步骤:

  • 更改为"发布"模式.
  • Project"Python" - 设置/MT和添加预处理器定义Py_NO_ENABLE_SHARED
  • 项目"Pythoncore" -构型到Static library (.lib),/ MT,代替预处理器定义Py_ENABLE_SHAREDPy_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)
Run Code Online (Sandbox Code Playgroud)

失败的项目是"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
Run Code Online (Sandbox Code Playgroud)

我看一下/ 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
Run Code Online (Sandbox Code Playgroud)

当我单击编辑时,我在另一个框中看到"继承的值",它们是:

NDEBUG
_WIN32
Run Code Online (Sandbox Code Playgroud)

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

DNS*_*DNS 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
Run Code Online (Sandbox Code Playgroud)

一旦您超越了直接错误,可能还需要执行其他一些操作:

  • 禁止创建嵌入式清单;请参阅 distutils msvc9compiler.py 中的 ~650 行;事实上,即使使用 /MT 构建时它也会创建这些,这是一个错误。

  • 将 distutils msvccompiler/msvc9compiler.py 中的 /MD 更改为 /MT,否则第三方库将无法正确构建。