繁体   English   中英

静态编译Python解释器?

[英]Compile the Python interpreter statically?

我正在构建一个专用的嵌入式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'

这将显示由于静态链接而无法编译的所有模块。

CPython CMake Buildsystem提供了一种使用CMake构建Python的替代方法。

它可以静态地构建python lib,并在该lib中包含您想要的所有模块。 只需设置CMake的选项

BUILD_SHARED                     OFF
BUILD_STATIC                     ON

并设置要ONBUILTIN_<extension>

使用freeze并不会阻止在一次运行中完成所有操作(无论使用何种方法,您都需要多个构建步骤 - 例如,许多编译器调用)。 首先,编辑Modules/Setup以包含所需的所有扩展模块。 接下来,构建Python,获取libpythonxy.a。 然后,您运行freeze,获取许多C文件和config.c。 您也可以编译它们,并将它们集成到libpythonxy.a中(或创建一个单独的库)。

对于要集成的每个体系结构和Python版本,您只需执行一次此操作。 构建应用程序时,只链接libpythonxy.a和冻结的库。

您可以尝试使用ELF STATIFIER 我以前一直在使用它,它运作得相当好。 我在几个案例中遇到了问题,然后我不得不使用另一个名为Ermine的类似程序。 不幸的是,这是一个商业计划。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM