我正在构建一个专用的嵌入式Python解释器,并希望避免依赖于动态库,因此我想改用静态库来编译解释器(例如,libc.a
不编译libc.so
)。
我还想静态链接Python标准库中所有的动态库。我知道可以使用来完成此操作Freeze.py
,但是有没有一种替代方法可以一步完成呢?
我发现了这一点(主要是关于Python模块的静态编译):
其中描述了用于配置的文件,位于:
<Python_Source>/Modules/Setup
如果此文件不存在,则可以通过复制来创建:
<Python_Source>/Modules/Setup.dist
该Setup
文件中包含大量文档,并且README
源中随附的文件也提供了许多良好的编译信息。
我还没有尝试编译,但是我认为有了这些资源,尝试时我应该会成功。我将在此处发布结果作为评论。
要获取纯静态的python可执行文件,还必须配置如下:
./configure LDFLAGS="-static -static-libgcc" CPPFLAGS="-static"
在启用这些标志的情况下进行构建后,您可能会收到许多有关“由于库不存在而重新命名”的警告。这意味着您没有Modules/Setup
正确配置,需要:
a)像这样添加一行(在顶部附近):
*static*
(星号/星号为“静态”,星号不带空格)
b)取消注释您希望静态可用的所有模块(例如数学,数组等)
您可能还需要添加特定的链接器标志(如我在上面发布的链接中所述)。到目前为止,我的经验是这些库无需修改即可正常工作。
如下运行make可能也会有所帮助:
make 2>&1 | grep 'renaming'
这将显示由于静态链接而无法编译的所有模块。
问题内容: 我试图更清楚地了解python编译器/解释器的过程。不幸的是,我没有上过口译课,也没有读过很多关于口译的文章。 基本上,我现在所了解的是,.py文件中的Python代码首先被编译为python字节码(我认为这是我偶尔看到的.pyc文件?)。接下来,字节码被编译成机器码,这是处理器真正理解的语言。差不多,我已经读过这个线程。为什么python在解释之前将源代码编译为字节码? 考虑到我对编
我们检查一下PHP语言中get_loaded_extensions()函数的输出,会发现有一些扩展并没有php.ini文件中调用,而它们确实也已经加载到PHP里去了,可以让我们在PHP语言中使用,如standard、Reflection、Core等。它们便是静态编译的,它们没有被编译成so或者dll文件供PHP动态调用,而是直接和PHP主程序编译到一起。 在*nix上执行静态编译 现在,先让我们执
问题内容: 为什么我们说Java是一种编译和解释语言? (编译和解释)这样做有什么好处? 问题答案: Java在编译时被编译为中间的“字节码”。这与像C之类的语言在编译时被编译为机器语言相反。Java字节代码无法像编译的C代码那样直接在硬件上执行。相反,字节码必须在运行时由JVM(Java虚拟机)解释才能执行。像C这样的语言的主要缺点是,当编译该二进制文件时,该二进制文件将仅在一种特定的体系结构(
那么,让我看看我是否明白了这一点。 > 当我们说编译器和解释器之间的区别时,解释器将高级指令翻译成中间形式,然后执行。[我认为编译器也将高级指令翻译成中间形式,但此刻它生成目标代码而不是执行它,对吗?] 解释器一次读取一条指令或一行的源代码,将该行转换为机器代码并执行它。[解释器本身不会将代码转换为机器代码,它会使用ist自己的预编译函数评估指令(在解析之后)。例如,高级语言中的Add表达式将使用
翻译的结果是什么?它会把高级语言变成汇编语言还是机器语言,即二进制代码? 如果是后者,这是否意味着解释语言与介绍集没有关系? 一种语言只能有一个口译员?是因为解释器不做任何优化,所以我们不需要找到更好的解释器吗?
静态(编译期)断言由一个常量表达式及一个字符串文本构成: static_assert(expression, string); expression在编译期进行求值,当结果为false(即:断言失败)时,将string作为错误消息输出。例如: static_assert(sizeof(long) >= 8, “64-bit code generation required for this