我正在尝试使用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/,选择 Gzipped源tar球(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。这些是我正在做的步骤:
/MT
并添加预处理器定义Py_NO_ENABLE_SHARED
Static library (.lib)
,/ MT,用Py_ENABLE_SHARED
替换预处理器定义Py_NO_ENABLE_SHARED
构建摘要:
构建:5成功, 1失败,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”。
当我谷歌搜索这些错误时,我只在mail.pythong.org找到一个对话: http://www.groupsrv.com/computers/about397568.html
我尝试在pythoncore项目中删除预处理定义“_USRDLL”,但错误仍然相同。
pythoncore中的预处理器定义是:
_USRDLL
Py_BUILD_CORE
Py_NO_ENABLE_SHARED
WIN32
当我点击编辑时,我会在另一个框中看到“继承的值”,它们是:
NDEBUG
_WIN32
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
答案 0 :(得分: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
一旦超出即时错误,可能还需要其他一些事情:
禁止创建嵌入式清单;请参阅distutils中的〜650行msvc9compiler.py;事实上即使用/ MT构建它也会产生这些错误。
在distutils msvccompiler / msvc9compiler.py中将/ MD更改为/ MT,因为否则第三方库不能正确构建。