小编典典

静态编译Python解释器?

python

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

我还想静态链接Python标准库中所有的动态库。我知道可以使用来完成此操作Freeze.py,但是有没有一种替代方法可以一步完成呢?


阅读 315

收藏
2020-12-20

共1个答案

小编典典

我发现了这一点(主要是关于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'

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

2020-12-20