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

2023-12-22

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

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

In hello.cpp我有一个#include "Python.h",所以我从这里下载 Python 源代码:http://www.python.org/download/releases/2.6.6/ http://www.python.org/download/releases/2.6.6/,选择Gzip 压缩源 tar 球 (2.6.6)。我添加了 include dir 并收到有关缺少 Python26.lib 的错误。所以我正在尝试编译它。默认构建创建 python26.lib 但它只有 200 KB,这不是静态库,当尝试编译 hello.cpp 时,我遇到缺少引用错误。

在自述文件中,我没有看到任何有关如何静态构建它的有用说明。然而,我用谷歌搜索了一个在线自述文件,对于 trunk (3.x) 中的最新版本的 python,有一些关于静态构建的有用信息:

http://svn.python.org/projects/python/trunk/PCbuild/readme.txt 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 with Py_NO_ENABLE_SHARED
  • 项目“Pythonw” - 与“Python”中的相同。
  • 我右键单击“Python”上的“构建”。

构建总结:

构建:5 成功,1 failed, 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”。

当我在 google 上搜索这些错误时,我只在 mail.pythong.org 上找到了一段对话:http://www.groupsrv.com/computers/about397568.html 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


我一直在构建从 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 msvc9compiler.py 中的 ~650 行;事实上,即使使用 /MT 构建时它也会创建这些,这是一个错误。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CPython 源 - 如何构建静态 python26.lib? 的相关文章

随机推荐

  • 从 genymotion 访问 homestead 主机

    我如何从genymotion模拟器访问homestead 我将这一行添加到模拟器中hosts文件 但不起作用 192 168 10 10 myapp app 以下是我在 Windows 10 上的操作方法 检查宅基地是否有效 我的宅基地在该
  • [NSMutableDictionary setValue: value forKey: key] 是否保留 NSString key?

    添加项目时NSMutableDictionary使用setValue forKey 方法 我想这可以推广到任何NSObject 字典是否保留第二个参数 即NSString 例如 NSAutoreleasePool pool NSAutore
  • Gradle:将 jar 依赖项包含到 Ear/libs 中

    我正在使用 Gradle 创建耳朵 但我很难弄清楚如何正确地将依赖项包含在 lib 文件夹中 我知道我可以使用 earlib project group name version 在那里包含罐子 这些 jar 的编译依赖项也将添加到 Ear
  • 将 JSON 单个字符串反序列化为数组

    我正在尝试反序列化我的 json 数据 但是我的类未正确设置 我无权更改 json 响应 因此我需要编写一个函数来正确处理 json 这是数据 blabla Score 1 Ref 50 foo colour Yellow ref y50
  • 字符串超过 maxJsonLength 且小于 250kb

    我将实体与ajax 一起使用 我想要在使用 JavaScript 创建的网格中使用实体框架提供的完整表格 我当前发送的表格少于 140 行 如果表中只有 50 行 那么我的代码就可以工作 并且出现以下错误 Message Error dur
  • 从 C 包装器调用 R 函数

    我有一个像这样的函数 callFunc lt function f f 1 f可以是 例如 f lt function x x 为了简化事情 假设我知道 f 应该返回一个数字并接受一个数字 我想搬家callFunc到C 但仍然有功能f在 R
  • 循环从节点 Promise 返回的对象并提供给下一个 .then

    我似乎永远被这个问题困扰了 我刚刚进入节点 并开始思考承诺等 我想做的是从 Spotify API 获取数据 我做的第一件事就是获取我自己的播放列表 function getPlaylists access token var option
  • 如何使用 jQuery 从文件添加内容?

    我有主要的html文档 div div 我还有一个内容文件 不是 html 文档 只是 html 代码 div class CodeRay div class code pre span class no 1 span require pr
  • 神经网络初始化 - Nguyen Widrow 实现?

    我尝试过实现 Nguyen Widrow 算法 如下 它似乎运行正常 但我有一些后续问题 这看起来像一个正确的实现吗 Nguyen Widrow 初始化是否适用于任何网络拓扑 尺寸 即5层自动编码器 Nguyen Widrow 初始化对任何
  • 性能和耐久性存储API(块存储)

    我们是 DST India 团队的一员 目前我们正在为客户提供一项产品 我们尝试使用 SoftLayer 提供的 REST API 将 SoftLayer 的性能和耐用存储功能集成到 ICO 中 我已经浏览了 SoftLayer 文档 但找
  • 在电子邮件中附加多种图像格式,而不仅仅是 JPG

    这就是我到目前为止所拥有的 MemoryStream imgStream new MemoryStream System Drawing Image img System Drawing Image FromStream fuImage P
  • 如何在Python中连接字符串和数字? [复制]

    这个问题在这里已经有答案了 我试图在Python 中连接一个字符串和一个数字 当我尝试这样做时 它给了我一个错误 abc 9 错误是 Traceback most recent call last File
  • HashMap 和 int 作为键

    我正在尝试构建一个 HashMap 它将整数作为键 将对象作为值 我的语法是 HashMap
  • Win2008 R2 上的 MSMQ 不会接收来自旧客户端的消息

    我在这里遇到一个非常奇怪的问题 我有一台安装了消息队列的 Windows 2008 R2 服务器 在另一台计算机上 运行 Windows 2003 的服务被设置为将消息发送到 2008 服务器上的公共队列 但是 消息永远不会显示在服务器上
  • 视频文件的下载链接

    我有一个视频想要提供下载链接 然而 创建了一个简单的 a href myvideo mp4 Download a 标签 当我点击它 在 Firefox 和 Chrome 中 时 它开始播放视频而不是允许下载视频 有没有一种方法可以在所有当前
  • 在 PHP 中如何不允许用户在注销后返回?

    我刚刚编写了一个PHP登录脚本 我想要完成的是 当用户单击注销链接时 在注销后 无论单击浏览器的后退按钮 他们都无法访问该页面 这是注销功能 Start the Session session start session destroy h
  • 如何在 DTrace 操作中打印 CFStringRef?

    我有一个 DTrace 探针捕获对函数的调用 该函数的参数之一是CFStringRef 这是保存指向 unicode 字符串的指针的私有结构 但是CFStringRef本身不是一个char 所以普通的 DTrace 方法如copyinstr
  • 使用 xdebug 和 netbeans 调试 php-cli 脚本?

    我已设法从 IDE 本身启动 php cli 脚本调试会话 但我需要从 shell 命令行启动调试会话 这些是相当复杂的维护 PHP 脚本 需要大量输入参数 因此从 Netbeans 中输入参数有点麻烦 我之前用 Zend studio 做
  • XML 模式中的递归?

    我需要创建一个 XML 模式来验证 XML 文档的树结构 我不确切知道树的出现次数或深度级别 XML 示例
  • CPython 源 - 如何构建静态 python26.lib?

    我正在尝试使用 Cython 将 hello pyx 文件编译为 exe 第一步是使用命令 cython cplus embed hello pyx 将 hello pyx 编译为 hello cpp 文件 Embed选项意味着Genera