【问题标题】:How do I call a C++ static library from Perl?如何从 Perl 调用 C++ 静态库?
【发布时间】:2009-02-25 10:03:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ perl


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您想看看使用 XS,这是 Perl 通常与 C/C++ 库交互的方式。这不是微不足道的。 Perl 文档的几个相关部分:

      【讨论】:

        【解决方案3】:

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

        其次,由于 C++ 会破坏名称(如果您问我,这是 C++ 最烦人的“功能”之一),您需要一个包含挂钩函数的外部“C”块。如果您使用的是 C++,您可能会使用一个钩子函数,该函数返回实现您需要使用的接口的 C++ 对象。由于您使用的是 perl,因此您可能需要将对象包装在这样的接口中:

        CPPObject 对象; 外部“C” { int初始化对象(无效) { 返回对象.init(); } int DoCoolStuff( 无效 ) { 返回对象.DoCoolStuff(); } int DoOtherCoolStuff(int foo) { 返回对象.DoOtherCoolStuff( foo ); } int DestroyObject( 无效 ) { 返回对象.Destroy(); } }

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

            可能不是您想的那样,但是编写一个独立的 C++ 程序如何让 perl 程序通过管道与之通信?

            【讨论】:

              【解决方案6】:

              我才刚刚开始了解 XS,所以我无法提供太多帮助。但这是我所知道的......

              XSpp,它是 C++ 的 XS。它与WxPerl 一起分发。 WxPerl 正在积极响应的开发中。

              Inline:CPP 可用于编写您的初始接口/包装器代码。然后就可以分析生成的XS了。但是,它看起来并没有那么好维护。如果它有效,它可能会为您提供一个良好的开端。

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

              【讨论】:

                猜你喜欢
                • 2020-02-06
                • 2019-12-19
                • 2018-01-06
                • 2018-03-15
                • 2014-08-07
                • 1970-01-01
                • 2020-01-03
                • 2015-01-18
                • 1970-01-01
                相关资源
                最近更新 更多