[英]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
并设置要ON
的BUILTIN_<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.