【问题标题】:Compile the Python interpreter statically?静态编译 Python 解释器?
【发布时间】:2010-11-12 03:08:30
【问题描述】:

我正在构建一个专用的嵌入式 Python 解释器,并希望避免依赖于动态库,因此我想用静态库来编译解释器(例如 libc.a 而不是 libc.so)。

我还想静态链接作为 Python 标准库一部分的所有动态库。我知道这可以使用Freeze.py 来完成,但是有没有其他方法可以一步完成?

【问题讨论】:

  • 当有人说“从不 blah blah blah”时,我总是很怀疑;在我的场景中,静态链接完全有意义。不过感谢您的链接。
  • @sehe:静态链接有很多很好的理由,尤其是使用专有软件。对于那些以牙线为生的人来说很好,我仍然在一家专卖店工作,需要考虑我雇主的需求。用 GPL 或 LGPL 代码污染代码对我们来说是不可能的。静态链接和摆脱glibc 和朋友是实现这一目标的一种方法。
  • 我很欣赏静态链接是有目的的。但是,它与许可的关系... 最好 是微不足道的。如果许可将成为争论的焦点,那么肯定动态链接在很大程度上胜过静态链接,因为动态链接被认为是 GPL 意义上的衍生作品,但是静态链接。伊纳尔虽然。无论如何,静态链接不是摆脱 glibc 的方法。不使用 glibc(静态或动态)是实现该目标的唯一方法
  • @sehe 不,你已经走了。如果你动态链接一个 GPL 库,你必须发布你的源代码:gnu.org/licenses/gpl-faq.en.html#GPLStaticVsDynamic
  • @Navin 有趣。我想知道我花了这么多年才终于有人以这种特殊的方式向我解释它。您是否有明确说明该目标并将其与许可措辞相关联的来源?我一定会阅读的。

标签: c++ python c compilation


【解决方案1】:

我发现了这个(主要是关于 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'

这将显示由于静态链接而无法编译的所有模块。

【讨论】:

  • 不应该是make 2&gt;&amp;1
  • 如果在构建 PyDateTime 时出现问题,请使用此 hack bugs.python.org/issue19348
  • 要让ssl 模块正常工作,您可能需要添加-ldl
【解决方案2】:

CPython CMake Buildsystem 提供了另一种构建 Python 的方法,使用 CMake

它可以静态构建python库,并在该库中包含您想要的所有模块。只需设置 CMake 的选项

BUILD_SHARED                     OFF
BUILD_STATIC                     ON

并将你想要的BUILTIN_&lt;extension&gt;设置为ON

【讨论】:

    【解决方案3】:

    使用 freeze 并不能阻止一次运行就完成所有操作(无论您使用哪种方法,您都需要多个构建步骤 - 例如,许多编译器调用)。首先,您编辑Modules/Setup 以包含您想要的所有扩展模块。接下来,构建 Python,获取 libpythonxy.a。然后,你运行 freeze,得到一些 C 文件和一个 config.c。您也可以编译它们,并将它们集成到 libpythonxy.a 中(或创建一个单独的库)。

    对于您想要集成的每个架构和 Python 版本,您只需执行一次所有这些操作。在构建应用程序时,您只需链接 libpythonxy.a 和 freeze 生成的库。

    【讨论】:

    • 感谢您的回复,但您忽略了我需要的部分:您如何“构建 Python 获取 libpythonxy.a”?你能再详细一点吗?还是只要运行make就可以自动生成lib?
    【解决方案4】:

    你可以试试ELF STATIFIER。我以前用过它,而且效果很好。我只是在几个案例中遇到了问题,然后我不得不使用另一个名为Ermine 的类似程序。不幸的是,这是一个商业程序。

    【讨论】:

    • 感谢帮助,但我不要伪静态库,我要静态链接。
    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2011-01-11
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 2023-01-05
    相关资源
    最近更新 更多