静态编译Python解释器?

时间:2009-07-19 17:23:57

标签: c++ python c compilation

我正在构建一个特殊用途的嵌入式Python解释器,并希望避免依赖动态库,所以我想用静态库编译解释器(例如libc.a而不是libc.so)。< / p>

我还想静态链接属于Python标准库的所有动态库。我知道这可以使用Freeze.py来完成,但有没有其他方法可以一步完成?

4 个答案:

答案 0 :(得分:31)

我发现了这个(主要涉及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'

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

答案 1 :(得分:8)

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

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

BUILD_SHARED                     OFF
BUILD_STATIC                     ON

并设置您想要的BUILTIN_<extension> ON

答案 2 :(得分:6)

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

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

答案 3 :(得分:3)

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