- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试使用 Cython 将我的 hello.pyx 文件编译为 exe。
第一步是使用命令“cython --cplus --embed hello.pyx”将 hello.pyx 编译成 hello.cpp 文件。 Embed
选项表示生成一个嵌入 Python 解释器的 main() 函数
。我正在尝试创建一个没有依赖项的独立 exe。
在 hello.cpp
中,我有一个 #include "Python.h"
,所以我从这里下载 Python 源代码:http://www.python.org/download/releases/2.6.6/ ,选择 Gzipped source tar ball (2.6.6)。我添加了 include 目录并收到有关缺少 Python26.lib 的错误。所以我正在尝试编译它。默认构建创建 python26.lib,但它只有 200 KB,这不是静态库,在尝试编译 hello.cpp 时出现引用丢失错误。
在 README 中,我没有看到任何关于如何静态构建它的有用说明。但是,我在网上搜索了一个 README 文件,对于 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)".
但是这里还是没有太多的细节,我是不是把解决方案中的所有项目都设置为静态库构建?还是只有 pythoncore? “Python”和“Pythonw”项目是“应用程序”,所以我只能将运行时库更改为/MT。这些是我正在执行的步骤:
/MT
并添加预处理器定义 Py_NO_ENABLE_SHARED
静态库 (.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”,这是日志:
------ 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.python.org 上找到一个对话: http://www.groupsrv.com/computers/about397568.html
我尝试删除 pythoncore 项目中的预处理器定义“_USRDLL”,但错误仍然相同。
pythoncore中的预处理器定义是:
_USRDLL
Py_BUILD_CORE
Py_NO_ENABLE_SHARED
WIN32
当我点击编辑时,我在另一个框中看到“继承值”,它们是:
NDEBUG
_WIN32
那个Ndebug很奇怪,因为我把mode改成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
一旦你超越了直接的错误,一些其他可能是必要的事情:
禁止创建嵌入式 list ;请参阅 distutils msvc9compiler.py 中的 ~650 行;事实上,即使在使用/MT 构建时它也会创建这些是一个错误。
在 distutils msvccompiler/msvc9compiler.py 中将/MD 更改为/MT,否则第三方库将无法正确构建。
关于python - CPython 源 - 如何构建静态 python26.lib?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8194489/
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 5 年前。 Improve
在 C# 静态方法中是否有一种方法可以引用定义该方法的类型? 在实例方法中,您可以通过以下方式确定类型: public void Foo() { Type type = this.GetTyp
WPF:静态、动态资源以及资源词典 静态资源与动态资源 我们常常会使用样式或者控件模板放在Window.Resources中,比如这样: 静态资源与动态资源使用如下: <Window
任何人都知道如何在共享/静态函数中动态加载控件?该函数本身位于 mustinherit/abstract 类中。 (这是 VB 中的 ASP.NET 项目)我想做这样的事情: VB: Publ
在我看来,静态/强类型编程语言最宝贵的一点是它有助于重构:如果/当您更改任何 API,那么编译器会告诉您该更改破坏了什么。 我可以想象用运行时/弱类型语言编写代码......但我无法想象没有编译器的帮
正如我的名字所暗示的,我是一名 .NET 开发人员,但我对 Java 的兴趣越来越大,并且我有兴趣学习更多其他语言,因为这有助于我学习更多关于编程的知识。 无论如何,我的问题是:不带参数/不使用状态的
我在java中使用WireMock来 stub POST请求。该请求返回一个存储在我本地的 json 正文文件。 stub 看起来像这样: wireMockServer.stubFor(get(url
Python 是否有类构造函数的机制,即每当首次引用类时(而不是创建该对象的实例时)调用的函数?我知道其他一些语言中也存在这种情况,但我还没有在 Python 中遇到过。 基本上,我想初始化该函数中的
Python 是否有类构造函数的机制,即每当首次引用类时(而不是创建该对象的实例时)调用的函数?我知道其他一些语言中也存在这种情况,但我还没有在 Python 中遇到过。 基本上,我想初始化该函数中的
这个问题已经有答案了: What is the difference between dynamic and static polymorphism in Java? (14 个回答) 已关闭 4 年
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Static initializer in Java 我想知道这个静态的东西(抱歉,这是我第一次遇到这个)对一个类有
如果c++应用程序是按以下方式组织的 //file1.cpp static Y sgObj = X::getInitObject(0); //declared in file scope //fil
我有一个抽象类(AvergedDataRecord),我需要进一步抽象(DataRecord),这样我就可以将它扩展到原始类和一个新的具体类(SummedDataRecord),并且我在获取某些方法时
我正在尝试制作一个字符串枚举。这是我到目前为止所得到的, private class TypedEnum : IEnumerable { public IEnumerator GetEnume
我选修了一门名为“安全代码”的类(class),在下一个作业中,我们应该对一些 C 文件和 JavaEE Web 项目进行静态/动态分析。 我检查了“源监视器”并在 C 文件上运行它,但是(除非我不知
我有两个类,一个是登录类,一个是用户类。在 loggedIn 类中,我想显示我在用户登录时所做的共享首选项。 loginPrefs = getSharedPreferences("loginprefe
我在同一个 Activity 中有两个静态 fragment ,在“fragmentA”中我有一个自定义列表,当一个项目被点击时必须在“fragmentB”中出现一个细节,细节只在我改变屏幕方向时出现
在 Java 中是未修改方法变量,缺少final,每次都重新初始化限定符 静态方法 实例方法 如果 1. 或 2.(或两者)的答案是 final 限定符允许 Java 执行优化并存储方法变量只有一次?
我有两个类相互交互。第一个是中心的,如下: public class Datenbank { double winkelPanel = 0; double groessePanel = 0; doub
我有一个 mysql 数据库,它连接基于 Web 的 php 应用程序和 FoxPro 应用程序(是的,foxpro)。在之前的“开发人员”被解雇后开始处理这个问题。 无论如何,我熟悉 AES_Enc
我是一名优秀的程序员,十分优秀!