静态编译Python解释器?

Jer*_*les 42 c c++ python compilation

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

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

Jer*_*les 31

我发现了这个(主要是关于Python模块的静态编译):

其中描述了用于配置的文件:

<Python_Source>/Modules/Setup
Run Code Online (Sandbox Code Playgroud)

如果此文件不存在,可以通过复制创建:

<Python_Source>/Modules/Setup.dist
Run Code Online (Sandbox Code Playgroud)

Setup文件中包含大量文档,README包含在源文件中也提供了大量良好的编译信息.

我还没有尝试编译,但我认为有了这些资源,我尝试时应该会成功.我会在此发表评论结果.

更新

要获得纯静态python可执行文件,还必须配置如下:

./configure LDFLAGS="-static -static-libgcc" CPPFLAGS="-static"
Run Code Online (Sandbox Code Playgroud)

一旦你启用这些标志构建,你可能会收到很多关于"重命名因为库不存在"的警告.这意味着您未Modules/Setup正确配置并需要:

a)添加一行(靠近顶部),如下所示:

*static*
Run Code Online (Sandbox Code Playgroud)

(这是星号/星号"静态"和星号,没有空格)

b)取消注释您想要静态可用的所有模块(例如数学,数组等......)

您可能还需要添加特定的链接器标志(如我上面发布的链接中所述).到目前为止,我的经验是图书馆正在不加修改地工作.

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

make 2>&1 | grep 'renaming'
Run Code Online (Sandbox Code Playgroud)

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

  • 不应该是'make 2>&1` (3认同)
  • 如果在构建PyDateTime时遇到一些问题,请使用此hack http://bugs.python.org/issue19348 (2认同)

Gaë*_*ann 8

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

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

BUILD_SHARED                     OFF
BUILD_STATIC                     ON
Run Code Online (Sandbox Code Playgroud)

并设置BUILTIN_<extension>你想要的ON.


Mar*_*wis 6

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

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