我正在编写一个C ++静态库,需要在多个应用程序之间共享,其中一个应用程序是用Perl编写的。不幸的是,我只知道核心的Perl语言(我读过Llama书),而且我并不熟悉它的库。如何从Perl脚本调用外部C ++二进制文件?
通过Google搜索,我在Perl Inline模块上找到了相关信息,但如果我理解正确,那就不是我需要的了。我很确定这是用于直接在Perl脚本中编写C和C ++代码,而不是用于调用外部C ++库。
C ++静态库正在为ARM处理器进行交叉编译,因此在运行Perl脚本的目标机器上将不会有C ++编译器。 (如果这有所不同。)
答案 0 :(得分:8)
您可以通过Inline :: C调用其他库中的代码(可能通过Inline :: CPP调用相同代码) - 查看Inline::C::Cookbook。很可能你想从Inline开始,在你完成实验之后使用生成的.XS文件来进一步工作。
答案 1 :(得分:5)
答案 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有帮助。