python - CPython 源 - 如何构建静态 python26.lib?

标签 python compilation static-linking cython cpython

我正在尝试使用 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 source tar ball (2.6.6)。我添加了 include 目录并收到有关缺少 Python26.lib 的错误。所以我正在尝试编译它。默认构建创建 python26.lib,但它只有 200 KB,这不是静态库,在尝试编译 hello.cpp 时出现引用丢失错误。

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

http://svn.python.org/projects/python/trunk/PCbuild/readme.txt

The solution has no configuration for static libraries. However it is easy it build a static library instead of a DLL. You simply have to set the "Configuration Type" to "Static Library (.lib)" and alter the preprocessor macro "Py_ENABLE_SHARED" to "Py_NO_ENABLE_SHARED". You may also have to change the "Runtime Library" from "Multi-threaded DLL (/MD)" to "Multi-threaded (/MT)".

但是这里还是没有太多的细节,我是不是把解决方案中的所有项目都设置为静态库构建?还是只有 pythoncore? “Python”和“Pythonw”项目是“应用程序”,所以我只能将运行时库更改为/MT。这些是我正在执行的步骤:

  • 更改为“发布”模式。
  • “Python”项目 - 设置 /MT 并添加预处理器定义 Py_NO_ENABLE_SHARED
  • “Pythoncore”项目 - 配置类型为静态库 (.lib),/MT,将预处理器定义 Py_ENABLE_SHARED 替换为 Py_NO_ENABLE_SHARED
  • “Pythonw”项目 - 与“Python”相同。
  • 我右键单击“Python 构建”。

构建总结:

Build: 5 succeeded, 1 failed, 0 up-to-date, 0 skipped

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.python.org 上找到一个对话: http://www.groupsrv.com/computers/about397568.html

我尝试删除 pythoncore 项目中的预处理器定义“_USRDLL”,但错误仍然相同。

pythoncore中的预处理器定义是:

_USRDLL
Py_BUILD_CORE
Py_NO_ENABLE_SHARED
WIN32

当我点击编辑时,我在另一个框中看到“继承值”,它们是:

NDEBUG
_WIN32

那个Ndebug很奇怪,因为我把mode改成Release了。

我正在使用安装了所有服务包的 Visual Studio 2008(不是 Express)。

顺便说一句。早些时候我尝试构建整个解决方案,但出现了一些关于丢失文件的错误,其路径以:“../../dba-”开头。


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

最佳答案

我一直在构建从 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

一旦你超越了直接的错误,一些其他可能是必要的事情:

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

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

关于python - CPython 源 - 如何构建静态 python26.lib?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8194489/

相关文章:

python - 如何在python中对具有相似文本的数据框进行分组

c++ - Qt Qt5Network 链接错误的静态构建

c++ - QT 5.7 MSVC 2015 静态构建不工作

static-linking - MinGW-w6 4's ar.exe can' t 尝试构建静态库时找不到库

c++ - 使用 g++ 链接时出现错误

c - 在这种情况下计算机如何知道是使用静态链接还是动态链接

列表理解中的python可迭代列表理解

python - Kafka分区延迟增加

python - 如何在 Python 中读取简单的 Json 结果(来自 Google 计算器)?

c++ - 为什么 clang 拒绝 gcc 接受的这个 unordered_set 定义?