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

时间:2009-01-09 14:07:52

标签: c++ perl

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

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

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

6 个答案:

答案 0 :(得分:8)

您可以通过Inline :: C调用其他库中的代码(可能通过Inline :: CPP调用相同代码) - 查看Inline::C::Cookbook。很可能你想从Inline开始,在你完成实验之后使用生成的.XS文件来进一步工作。

答案 1 :(得分:5)

您希望了解如何使用XS,这是Perl通常与C / C ++库接口的方式。这不是一件容易的事。 Perl文档的几个相关部分:

答案 2 :(得分:4)

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

其次,由于C ++会破坏名称(如果你问我,C ++中最烦人的“功能”之一),你需要一个包含钩子函数的extern“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();
}

}

答案 3 :(得分:2)

你需要创建一个可以从perl和AFAIK调用的包装函数,你需要将这个包装函数放在动态库中(除非你要重建perl二进制文件并将静态库链接到它)。我喜欢使用一个名为SWIG(简单包装器接口生成器)的工具来为我创建包装器。它也可以为17种左右的其他语言创建包装。

答案 4 :(得分:1)

可能不是你在想什么,但是如何编写perl程序通过管道与之通信的独立C ++程序呢?

答案 5 :(得分:0)

我只是开始围绕XS,所以我无法提供太多帮助。但这就是我所知道的......

XSpp,这是XS for C ++。它与WxPerl一起分发。 WxPerl正处于积极响应的发展阶段。

内联:CPP可用于编写初始接口/包装代码。然后,您可以分析生成的XS。然而,它看起来并不那么好。如果它有效,它可能会为您提供良好的开端。

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