我正在构建一个专用的嵌入式Python解释器,并希望避免依赖于动态库,因此我想改用静态库来编译解释器(例如,libc.a不编译libc.so)。
libc.a
libc.so
我还想静态链接Python标准库中所有的动态库。我知道可以使用来完成此操作Freeze.py,但是有没有一种替代方法可以一步完成呢?
Freeze.py
我发现了这一点(主要是关于Python模块的静态编译):
其中描述了用于配置的文件,位于:
<Python_Source>/Modules/Setup
如果此文件不存在,则可以通过复制来创建:
<Python_Source>/Modules/Setup.dist
该Setup文件中包含大量文档,并且README源中随附的文件也提供了许多良好的编译信息。
Setup
README
我还没有尝试编译,但是我认为有了这些资源,尝试时我应该会成功。我将在此处发布结果作为评论。
要获取纯静态的python可执行文件,还必须配置如下:
./configure LDFLAGS="-static -static-libgcc" CPPFLAGS="-static"
在启用这些标志的情况下进行构建后,您可能会收到许多有关“由于库不存在而重新命名”的警告。这意味着您没有Modules/Setup正确配置,需要:
Modules/Setup
a)像这样添加一行(在顶部附近):
*static*
(星号/星号为“静态”,星号不带空格)
b)取消注释您希望静态可用的所有模块(例如数学,数组等)
您可能还需要添加特定的链接器标志(如我在上面发布的链接中所述)。到目前为止,我的经验是这些库无需修改即可正常工作。
如下运行make可能也会有所帮助:
make 2>&1 | grep 'renaming'
这将显示由于静态链接而无法编译的所有模块。