在这个问题中,我看到了两个不同的答案,如何直接调用用C++编写的函数
我只是浏览了SO标签[perl] [swig]中的几乎所有问题,以便找到下一个问题的答案:
在我考虑它时,使用SWIG对于其他用途更为普遍,就像在这个问题中提到的那样,Inline :: CPP是perl特定的.但是,从perl的角度来看,这里有一些(任何)重大差异吗?
我没有使用过SWIG,所以我不能直接对它说话.但我非常熟悉与在线:: CPP.
如果你想编写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的一个优点是,如果您已经拥有perlguts,perlapi和perlcall的一些经验,那么您已经感到宾至如归.使用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系列模块的人.
您可能还会发现我的Perl Mongers在Inline :: CPP上的讨论对于探索它如何对您有用非常有用.此外,Math :: Prime :: FastSieve是基于Inline :: CPP(具有Inline :: CPP依赖性)的模块的概念验证.此外,Rob(sisyphus),当前的Inline维护者,以及InlineX :: CPP2XS的作者实际上已经在InlineX :: CPP2XS发行版中包含了一个示例,它使用我的Math :: Prime :: FastSieve并使用他的将其转换为普通的XS代码InlineX :: CPP2XS.
| 归档时间: |
|
| 查看次数: |
699 次 |
| 最近记录: |