代码之家  ›  专栏  ›  技术社区  ›  Bill the Lizard

如何从Perl调用C++静态库?

  •  11
  • Bill the Lizard  · 技术社区  · 16 年前

    我正在编写一个C++静态库,需要在多个应用程序之间共享,其中一个应用于Perl。不幸的是,我几乎不知道核心Perl语言(我读过llama的书),而且我对它的库也不太熟悉。如何从Perl脚本调用外部C++二进制文件?

    通过谷歌搜索,我找到了Perl的信息 Inline 模块,但如果我理解正确,那不是我需要的。我确信这是在你的Perl脚本中直接编写C和C++代码,而不是调用外部C++库。

    C++静态库正在为ARM处理器进行交叉编译,因此在Perl脚本将运行的目标机器上不会有C++编译器。(如果这有区别的话。)

    6 回复  |  直到 16 年前
        1
  •  5
  •   Adam Bellaire    16 年前

    你想看看使用XS,这是Perl通常如何与C/C++库接口。这不算小事。Perl文档的几个相关部分:

        2
  •  8
  •   Solyad    16 年前

    您可以通过inline::c从其他库调用代码(也可能通过inline::cpp调用相同的代码)-请看一下 Inline::C::Cookbook . 最有可能的情况是,您希望从inline开始,并在试验完成后,使用生成的.xs文件进一步工作。

        3
  •  4
  •   dicroce    16 年前

    首先,它需要在动态库中,而不是静态库中(除非您将重新编译Perl本身并将其链接到静态库中)。

    第二,因为C++会把名字(一个最讨厌的“C++”特性之一,如果你问我),你需要一个包含钩子函数的外部“C”块。如果您使用C++,则可以使用单个钩子函数来返回实现需要使用的接口的C++对象。因为您使用的是Perl,所以可能需要将对象包装在这样的接口中:

    CPPObject object;
    
    extern "C"
    {
    
    int InitObject( void )
    {
      return object.init();
    }
    
    int DoCoolStuff( void )
    {
      return object.DoCoolStuff();
    }
    
    int DoOtherCoolStuff( int foo )
    {
      return object.DoOtherCoolStuff( foo );
    }
    
    int DestroyObject( void )
    {
      return object.Destroy();
    }
    
    }
    
        4
  •  2
  •   Mr Fooz    16 年前

    您需要创建一个可从Perl调用的包装函数,而afaik,您需要让这个包装函数位于动态库中(除非您要重建Perl二进制文件并将静态库链接到它)。我喜欢用一种叫做 SWIG (简单的包装接口生成器)为我创建包装。它也可以为17种语言或其他语言创建包装器。

        5
  •  1
  •   Paul Tomblin    16 年前

    可能不是你所想的,而是写一个独立的C++程序,Perl程序通过管道与它通信?

        6
  •  0
  •   daotoad    16 年前

    我只是开始把我的头缠在XS上,所以我不能提供太多帮助。但我知道的是…

    XSpp ,这是C++的XS。它与 WxPerl . WXperl正在积极响应的发展中。

    inline:cpp可用于编写初始接口/包装器代码。然后您可以分析生成的XS。不过,它看起来维护得不太好。如果它起作用,可能会给你一个良好的开端。

    你可能会发现 this short note on XS and C++ by John Keiser 如果有点过时,会很有帮助。