【问题标题】:Can I statically link Cython modules into an executable which embeds python?我可以将 Cython 模块静态链接到嵌入 python 的可执行文件中吗?
【发布时间】:2011-12-03 08:38:09
【问题描述】:

我目前有一个从嵌入 python 的 C++ 编译的可执行文件。嵌入式可执行文件运行一个加载多个 Cython 模块的 python 脚本。 Cython 模块和可执行文件都链接到共享库。

我想通过静态链接共享库与可执行文件来将共享库移动到可执行文件中。

我可以将 Cython 模块静态链接到嵌入 python 的可执行文件中吗?处理这种情况的最佳方法是什么?

【问题讨论】:

    标签: python static-libraries cython


    【解决方案1】:

    是的,这是可能的,但是如果您使用 python 解释器的话。我将要描述的已经为 IOS 平台上的 python 完成了。如果您不想接触原始的 Python 解释器,您需要检查更多如何让 Python 了解您的模块(用您自己的标签/库名替换 TEST)

    一种可能的方法是:

    • 编译你自己的python with a dynload patch,它不希望你的模块使用dlopen(),而是直接使用dlsym()来检查模块是否已经在内存中。

    • 创建一个 libTEST.a,包括在构建过程中生成的所有 .o(不是 .so)。您通常可以在build/temp.* 中找到它,然后执行以下操作:

      ar rc libTEST.a build/temp.*/*.o
      ranlib libTEST.a
      
    • 在编译主可执行文件时,您需要通过在编译命令行中追加来向新的 libTEST.a 添加依赖项:

      -lTEST -L.

    结果将为您提供一个包含 cython 模块中所有符号的可执行文件,python 将能够在内存中搜索它们。

    (例如,我使用了一个增强的包装器,它在编译期间重定向 ld 以不生成 .so,并在最后创建一个 .a。在 kivy-ios 项目中,您可以获取 liblink 即用于生成 .o,biglink 用于抓取目录中的所有 .o 并生成 .a。您可以在 build_kivy.sh 中看到它是如何使用的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-07
      • 2021-07-27
      • 2013-06-24
      • 2012-12-01
      相关资源
      最近更新 更多