我正在构建一个专用的嵌入式 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'
这将显示由于静态链接而无法编译的所有模块。
关于c++ - 静态编译 Python 解释器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1150373/