2011-12-03 38 views
4

我目前有一个嵌入python的C++编译的可执行文件。嵌入式可执行文件运行一个加载了几个Cython模块的python脚本。 Cython模块和可执行文件都链接到共享库。我可以将Cython模块静态链接到嵌入python的可执行文件中吗?

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

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

回答

7

是的,这是可能的,但如果你有一只手在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项目上,您可以抓取用于生成的liblink .o和biglink,用于抓取目录中的所有.o文件,并生成.a。您可以看到它如何在build_kivy.sh

+1

似乎链接已损坏... – Bach

相关问题