使用Inline :: CPP与SWIG - 什么时候?

时间:2012-07-23 07:22:27

标签: perl swig

this问题中,我看到了两个不同的答案,如何直接调用用C ++编写的函数

  1. Inline::CPP(此处更多,如Inline :: C,Inline :: Lua等。)
  2. SWIG
  3. 手工制作(如daxim所说 - 大多数模块都是手写的)
  4. 我只是浏览了SO标签[perl] [swig]中的几乎所有问题,以便为下一个问题寻找答案:

    • 使用(选择)SWIG和Inline :: CPP或手写?
    • 有哪些主要区别?
    • 何时是“良好做法” - 推荐使用Inline :: CPP(或内联:C)以及何时推荐使用SWIG或手写?

    在我考虑它时,使用SWIG对于其他用途更为普遍,例如问in this question和Inline :: CPP是perl特定的。但是,从perl的角度来看, 在这里有一些(任何)显着的差异?

2 个答案:

答案 0 :(得分:6)

我还没有使用过SWIG,所以我不能直接对它说话。但我pretty familiar Inline::CPP {/ 3}}。

如果你想编写C ++代码,这些代码可以从Perl中编译并变得可调用,那么Inline :: CPP可以促进这一点。只要C ++代码没有改变,它应该只编译一次。如果你将模块基于Inline :: CPP,代码将在模块安装时编译,因此另一个用户从未真正看到第一次编译延迟;它发生在安装时,就在测试阶段之前。

Inline :: CPP并非100%免于可携带性。目标用户必须具有与用于构建Perl的C编译器类似的C ++编译器,并且C ++标准库应该是使用Perl生成二进制兼容代码的版本。 Inline :: CPP与CPAN测试人员的成功率大约为94%。最后6%的问题几乎总是归结为安装过程中没有正确破译C ++编译器和库的问题。 ......其中,通常归结为图书馆。

让我们假设您作为模块作者发现自己在95%的人中安装了Inline :: CPP没有问题。如果您知道目标受众将属于同一类别,那么基于Inline :: CPP生成模块很简单。你基本上必须添加几个指令(VERSION和NAME),并将你的Makefile.PL的ExtUtils :: MakeMaker调用换成Inline :: MakeMaker(它将调用ExtUtils :: MakeMaker)。在创建发行版时,您可能还需要CONFIGURE_REQUIRES指令来指定当前版本的ExtUtils :: MakeMaker;这可以确保您的用户拥有更清洁的安装体验。

现在,如果您正在创建一般消费模块,并且不知道您的目标用户是否适合94%多数人可以使用Inline :: CPP,那么最好不要删除Inline :: CPP依赖关系。您可能希望这样做只是为了最小化依赖链;它对你的用户来说更好。在这种情况下,编写代码以使用Inline :: CPP,然后使用InlineX :: CPP2XS将其转换为普通的旧XS模块。您的用户现在可以在没有首先拉入Inline :: CPP的过程的情况下进行安装。

C ++是一种大型语言,Inline :: CPP处理它的一大部分。注意typemap文件以确定可以自动传递(和转换)哪些类型的参数,以及使用" guts和API"更好地处理哪种类型的参数。调用。我不推荐使用的一个功能是自动字符串转换,因为它会产生Unicode不友好的转换。最好通过API调用显式处理字符串。

Inline :: CPP没有正常处理的C ++部分是模板元编程。您可以在代码中自由使用模板,并可以免费使用STL。但是,您不能简单地传递STL类型参数,并希望Inline :: CPP知道如何转换它们。它处理POD(基本数据类型),而不是STL的东西。此外,如果您编写基于模板的函数或对象方法,C ++编译器不会知道Perl计划调用函数的上下文,因此它不知道在编译时应用于模板的类型。因此,直接暴露给Inline :: CPP的函数和对象方法需要是普通函数或方法;不是模板函数或类。

只要您知道会发生什么,这些实践中的限制并不难以处理。如果要将模板类直接暴露给Inline :: CPP,只需编写一个包装类,该类继承或组合模板类,但为Inline :: CPP提供一个具体类型。

Inline :: CPP在为现有C ++库自动生成函数包装器时也很有用。文档说明了如何做到这一点。

Inline :: CPP优于Swig的优势之一是,如果您已经拥有perlgutsperlapiperlcall的一些经验,那么您已经感到宾至如归。使用Swig,您必须首先学习Swig的做事方式,然后弄清楚如何将其应用于Perl,以及如何以CPAN可分发的方式进行操作。

使用Inline :: CPP的另一个好处是它在Perl社区中是一个有点熟悉的工具。您将找到更多了解Perl XS,Inline :: C以及某种程度上Inline :: CPP的人,而不是您会发现使用Swl和Perl的人。虽然XS可能比较混乱,但与使用Perl和Swig相比,这是一条走得更远的道路。

Inline :: CPP也是inline@perl.org邮件列表中的常见主题。除了我自己之外,Inline :: C的维护者和其他几个Inline家庭维护者经常使用这个列表,并尽力帮助那些需要手动使用Inline系列模块的人。

您可能还会发现my Perl Mongers talk on Inline::CPP对于探索它如何对您有用非常有用。此外,Math::Prime::FastSieve代表了基于Inline :: CPP(具有Inline :: CPP依赖性)的模块的概念验证。此外,Rob(sisyphus),当前的Inline维护者和InlineX :: CPP2XS的作者实际上在InlineX::CPP2XS发行版中包含了一个示例,该示例采用了我的Math :: Prime :: FastSieve,并使用它将其转换为普通的XS代码他的InlineX :: CPP2XS。

答案 1 :(得分:1)

你应该也可以给ExtUtils::XSpp看看。我认为它需要你声明比Inline :: CPP或SWIG更多的东西,但它相当强大。