gpt4 book ai didi

python - 我可以将 Cython 模块静态链接到嵌入 python 的可执行文件中吗?

转载 作者:太空狗 更新时间:2023-10-29 21:40:52 26 4
gpt4 key购买 nike

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

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

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

最佳答案

是的,这是可能的,但如果你掌握了 python 解释器。我要描述的是在 IOS 平台上针对 python 所做的。如果你不想接触原始的 python 解释器,你需要检查更多如何让 python 知道你的模块(用你自己的标签/libname 替换 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中看到它是如何使用的)

关于python - 我可以将 Cython 模块静态链接到嵌入 python 的可执行文件中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8366544/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com