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

2024-06-09 18:23:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我在试着把我的你好.pyx使用Cython将文件保存到exe。在

第一步是编译你好.pyx变成一个你好.cpp文件使用命令“cython--cplus--embed你好.pyx". 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压缩源代码tarball(2.6.6)。我添加了include dir和get错误,关于缺少Python26.lib。所以我正在尝试编译它。默认构建创建python26.lib,但它只有200kb,这不是一个静态lib,当尝试编译时你好.cpp我有遗漏参考错误。在

在自述中,我没有看到任何关于如何静态构建它的有用说明。不过,我在google上搜索了一个在线自述文件,对于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)".

但是这里仍然没有太多的细节,我是否将解决方案中的所有项目都设置为静态库来构建?或者只有Python?”Python”和“Pythonw”项目都是“应用程序”,因此我只能将运行库更改为/MT。以下是我正在执行的步骤:

  • 切换到“释放”模式。在
  • 项目“Python”-设置/MT并添加预处理器定义Py_NO_ENABLE_SHARED
  • 项目“Pythoncore”-配置类型为Static library (.lib),/MT,将预处理器定义Py_ENABLE_SHARED替换为Py_NO_ENABLE_SHARED
  • 项目“Pythonw”-与“Python”中的相同。在
  • 我右键单击buildon“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”,日志如下:

^{pr2}$

我查看/PCbuild/目录,我看到了“pythoncore.lib存在(10MB),但没有“python26.lib”。在

当我搜索这些错误时,我只在邮箱:pythong.org: http://www.groupsrv.com/computers/about397568.html

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

pythoncore中的预处理器定义是:

_USRDLL
Py_BUILD_CORE
Py_NO_ENABLE_SHARED
WIN32

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

NDEBUG
_WIN32

这个Ndebug很奇怪,因为我把模式改为Release。在

我正在使用安装了所有service Pack的Visual Studio 2008(非Express)。在

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


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


Tags: 文件theto项目nopyenablelib
1条回答
网友
1楼 · 发布于 2024-06-09 18:23:58

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

  • 在distutils msvcompiler/msvc9中将/MD更改为/MT编译器.py,否则第三方libs将无法正确构建。

相关问题 更多 >