编译Python解释器静态?

我正在构build一个专用的embedded式Python解释器,并希望避免依赖dynamic库,所以我想用静态库来编译解释器(比如libc.a而不是libc.so )。

我也想静态链接所有属于Python标准库的dynamic库。 我知道这可以完成使用Freeze.py ,但是有一个替代scheme,以便它可以一步完成?

我发现这个(主要涉及Python模块的静态编译):

其中描述了位于此处的用于configuration的文件:

 <Python_Source>/Modules/Setup 

如果这个文件不存在,可以通过复制来创build:

 <Python_Source>/Modules/Setup.dist 

Setup文件中包含大量文档,源代码中包含的README文件也提供了很多很好的编译信息。

我还没有试过编译,但是我认为用这些资源,当我尝试时我应该是成功的。 我将在这里发表我的结果作为评论。

更新

要获得纯静态的python可执行文件,还必须按如下所示进行configuration:

 ./configure LDFLAGS="-static -static-libgcc" CPPFLAGS="-static" 

一旦你build立这些标志启用,你可能会得到很多关于“重命名,因为图书馆不存在”的警告。 这意味着你没有正确configurationModules/Setup ,需要:

a)像这样添加一行(靠近顶部):

 *static* 

(星号/星号“static”,星号不带空格)

b)取消注释所有你想静态提供的模块(如math,数组等)

您可能还需要添加特定的链接器标志(如上面发布的链接中所述)。 我迄今为止的经验是,图书馆没有任何修改地工作。

运行make也可能有帮助,如下所示:

 make 2>&1 | grep 'renaming' 

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

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

它可以静态地build立python库,并且在那个库里包含你想要的所有模块。 只需设置CMake的选项

 BUILD_SHARED OFF BUILD_STATIC ON 

并设置你想ONBUILTIN_<extension>

使用冻结并不妨碍在一次运行中完成所有操作(无论使用什么方法,都需要多个构build步骤 – 例如许多编译器调用)。 首先,编辑Modules/Setup以包含所需的所有扩展模块。 接下来,你build立Python,得到libpythonxy.a。 然后,你运行冻结,获得一些C文件和一个config.c。 你也可以编译它们,并将它们集成到libpythonxy.a中(或创build一个单独的库)。

对于每个要整合的体系结构和Python版本,您都要这样做一次。 在构build应用程序时,只能链接libpythonxy.a和冻结的库。

你可以试试ELF STATIFIER 。 我以前使用过它,它工作得很好。 我在一些情况下遇到了问题,然后我不得不使用另一个类似的程序叫做Ermine 。 不幸的是这是一个商业程序。