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

Hal*_*ate 7 python static-libraries cython

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

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

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

tit*_*ito 8

是的,这是可能的,但如果你有一个python口译员的手.我要在IOS平台上为python做了什么.如果你不想触及原始的python解释器(用你自己的标签/ libname替换TEST,你需要检查更多如何让python知道你的模块)

一种可行的方法是:

  • 使用dynload补丁编译你自己的python,而不是dlopen()你的模块,但直接使用dlsym()来检查模块是否已经在内存中.

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

    ar rc libTEST.a build/temp.*/*.o
    ranlib libTEST.a
    
    Run Code Online (Sandbox Code Playgroud)
  • 编译主可执行文件时,需要通过附加在编译命令行中为新的libTEST.a添加依赖项:

    -lTEST -L.

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

(作为一个例子,我正在使用一个增强的包装器,它在编译期间重定向ld而不生成.so,并在最后创建一个.a.在kivy-ios项目中,你可以获取用于生成.o的liblink.biglink用于获取目录中的所有.o并生成.a.您可以看到它在build_kivy.sh中的使用方式)