编译Python解释器静态?
我正在构build一个专用的embedded式Python解释器,并希望避免依赖dynamic库,所以我想用静态库来编译解释器(比如libc.a
而不是libc.so
)。
我也想静态链接所有属于Python标准库的dynamic库。 我知道这可以完成使用Freeze.py
,但是有一个替代scheme,以便它可以一步完成?
我发现这个(主要涉及Python模块的静态编译):
其中描述了位于此处的用于configuration的文件:
<Python_Source>/Modules/Setup
如果这个文件不存在,可以通过复制来创build:
<Python_Source>/Modules/Setup.dist
Setup
文件中包含大量文档,源代码中包含的README
文件也提供了很多很好的编译信息。
我还没有试过编译,但是我认为用这些资源,当我尝试时我应该是成功的。 我将在这里发表我的结果作为评论。
更新
要获得纯静态的python可执行文件,还必须按如下所示进行configuration:
./configure LDFLAGS="-static -static-libgcc" CPPFLAGS="-static"
一旦你build立这些标志启用,你可能会得到很多关于“重命名,因为图书馆不存在”的警告。 这意味着你没有正确configurationModules/Setup
,需要:
a)像这样添加一行(靠近顶部):
*static*
(星号/星号“static”,星号不带空格)
b)取消注释所有你想静态提供的模块(如math,数组等)
您可能还需要添加特定的链接器标志(如上面发布的链接中所述)。 我迄今为止的经验是,图书馆没有任何修改地工作。
运行make也可能有帮助,如下所示:
make 2>&1 | grep 'renaming'
这将显示所有由于静态链接而无法编译的模块。
CPython CMake Buildsystem使用CMake提供了另一种构buildPython的方法。
它可以静态地build立python库,并且在那个库里包含你想要的所有模块。 只需设置CMake的选项
BUILD_SHARED OFF BUILD_STATIC ON
并设置你想ON
的BUILTIN_<extension>
。
使用冻结并不妨碍在一次运行中完成所有操作(无论使用什么方法,都需要多个构build步骤 – 例如许多编译器调用)。 首先,编辑Modules/Setup
以包含所需的所有扩展模块。 接下来,你build立Python,得到libpythonxy.a。 然后,你运行冻结,获得一些C文件和一个config.c。 你也可以编译它们,并将它们集成到libpythonxy.a中(或创build一个单独的库)。
对于每个要整合的体系结构和Python版本,您都要这样做一次。 在构build应用程序时,只能链接libpythonxy.a和冻结的库。
你可以试试ELF STATIFIER 。 我以前使用过它,它工作得很好。 我在一些情况下遇到了问题,然后我不得不使用另一个类似的程序叫做Ermine 。 不幸的是这是一个商业程序。