我正在构建一个特殊用途的嵌入式Python解释器,并希望避免依赖动态库,所以我想用静态库编译解释器(例如libc.a
而不是libc.so
)。< / p>
我还想静态链接属于Python标准库的所有动态库。我知道这可以使用Freeze.py
来完成,但有没有其他方法可以一步完成?
答案 0 :(得分:31)
我发现了这个(主要涉及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'
这将显示由于静态链接而无法编译的所有模块。
答案 1 :(得分:8)
CPython CMake Buildsystem使用CMake提供了另一种构建Python的方法。
它可以静态地构建python lib,并在该lib中包含您想要的所有模块。只需设置CMake的选项
BUILD_SHARED OFF
BUILD_STATIC ON
并设置您想要的BUILTIN_<extension>
ON
。
答案 2 :(得分:6)
使用freeze不会阻止在一次运行中完成所有操作(无论使用何种方法,您都需要多个构建步骤 - 例如许多编译器调用)。首先,编辑Modules/Setup
以包含所需的所有扩展模块。接下来,构建Python,获取libpythonxy.a。然后,您运行freeze,获取许多C文件和config.c。您也可以编译它们,并将它们集成到libpythonxy.a中(或创建一个单独的库)。
对于要集成的每个体系结构和Python版本,您只需完成一次。构建应用程序时,只链接libpythonxy.a和冻结的库。
答案 3 :(得分:3)
您可以尝试使用ELF STATIFIER。我以前一直在使用它,它运作得相当好。我在几个案例中遇到了问题,然后我不得不使用另一个名为Ermine的类似程序。不幸的是,这是一个商业计划。