c++ - 静态编译 Python 解释器?

标签 c++ python c compilation

我正在构建一个专用的嵌入式 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/

相关文章:

c++ - 一个类对象可以容纳多大的属性?如何确定堆栈/堆限制?

c++ - 如何从字符串中获取 UTC 偏移量

c++ - 使用 ffmpeg 解码 h264 流会引入延迟,如何避免?

python - 获取 spotify 当前正在播放的轨道

python - 如何输出sklearn standardscaler

c - 在 C 中声明结构数组时的奇怪之处

C++:删除 == 或特定类型的任何其他运算符

python - 将 scrapy 转换为 lxml

c - C中的输出重定向

c - 字符串终止符问题