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

时间:2011-12-03 08:38:09

标签: python static-libraries cython

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

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

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

1 个答案:

答案 0 :(得分:8)

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

一种可能的方法是:

  • 编译您自己的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项目中,你可以抓住{{3 }}用于生成.o和liblink,用于获取目录中的所有.o并生成.a。您可以看到它在biglink中的使用方式)