我正在尝试使用 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