我在试着把我的你好.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。以下是我正在执行的步骤:
/MT
并添加预处理器定义Py_NO_ENABLE_SHARED
Static library (.lib)
,/MT,将预处理器定义Py_ENABLE_SHARED
替换为Py_NO_ENABLE_SHARED
生成摘要:
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
我一直在构建从2.4到2.7版本的Python静态版本,并且需要做一些设置工作。在
您确实需要更新解决方案中所有启用的项目的配置,将它们设置为/MT。要构建Python静态,它引用的所有内容(包括SQLite或OpenSSL等库)也必须是静态的。即使是.pyd模块也是如此,它们实际上并不包括在内,否则它们以后就不能被导入了。在
您可能还需要在Modules/socketmodule.h的顶部进行此编辑:
一旦你超越了直接的错误,一些其他的事情可能是必要的:
禁用嵌入清单的创建;请参阅distutils msvc9中的第650行编译器.py;事实上,即使在使用/MT构建时,它也会创建这些错误。
在distutils msvcompiler/msvc9中将/MD更改为/MT编译器.py,否则第三方libs将无法正确构建。
相关问题 更多 >
编程相关推荐