我需要为Perl编写一个XS模块.据我所知,今天h2xs已被大家弃用,今天启动XS模块的首选方法是什么?我查看了Module :: Starter,但它只处理纯Perl模块.
好吧,这是一个非常有趣的问题,并且可能没有任何简单的方法可以做到这一点,但想到我会在决定修改Perl是我的基本答案之前抛弃它.
所以我有一个以嵌入式方式调用Perl脚本的C应用程序.这一切都很好,花花公子,我可以传递信息并获取信息非常棒.然而,现在进入我的下一次征服; 我需要允许我的嵌入式脚本能够调用原始C叫它的C应用程序中的一些函数.
这很重要,因为XSUB会要求它是一个外部库; 但我不希望它是一个外部库我希望它是对C函数的直接调用.现在也许这可以通过XSUB完成,我刚刚阅读并理解错误.
Application -(run)-> Perl
Application <-(function_x())- Perl
Application -(returnfunction_x)-> Perl
Run Code Online (Sandbox Code Playgroud)
这不能是外部库的原因是因为我依赖于仅在应用程序中创建/存储的数据.
我正在尝试将XS编译成perl [ed(ikegami):也就是说他正在使用:: MakeMaker make perl来创建一个perl静态链接的C供应商库]但是当我这样做时,新版本的perl不支持动态加载模块.每当我尝试运行类似use Socket(或任何其他模块)的perl代码时,我得到:
Can't load module Socket, dynamic loading not available in this perl.
Run Code Online (Sandbox Code Playgroud)
是否有编译器/链接器开关我设置不正确或什么?所有这些都是在1998年和2004年在另一个盒子(PA-RISC上的hpux旧)上编译的,但是我们正在转向一个新的盒子(hpux11 itanium)而且我正在撞墙.
这是我的Makefile.PL:
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
'NAME' => 'Udtutil',
'VERSION_FROM' => 'Udtutil.pm', # finds $VERSION
'LIBS' => '-L/usr/ud/PFUSION/Udtutil -L/usr/ud/lib -lapidummy ' .
'-lshare -ludsql -ludmach -lbasic ' .
'-lperf -lret1 -lides -lpipe -lfunc -lndx -lrep -lshm ' .
'-lmglm …Run Code Online (Sandbox Code Playgroud) 我正在写一个XS模块.我分配了一些资源(例如malloc()或者SvREFCNT_inc()),然后执行一些涉及Perl API的操作,然后释放资源.这在普通的C中很好,因为C没有例外,但是使用Perl API的代码可能会croak()阻止正常的清理和泄漏资源.因此,除了相当简单的情况外,似乎不可能编写正确的XS代码.
当我croak()自己可以清理到目前为止分配的任何资源时,我可能会调用croak()直接的函数来回避我编写的任何清理代码.
伪代码来说明我的担忧:
static void some_other_function(pTHX_ Data* d) {
...
if (perhaps) croak("Could not frobnicate the data");
}
MODULE = Example PACKAGE = Example
void
xs(UV n)
CODE:
{
/* Allocate resources needed for this function */
Data* object_graph;
Newx(object_graph, 1, Data);
Data_init(object_graph, n);
/* Call functions which use the Perl API */
some_other_function(aTHX_ object_graph);
/* Clean up before returning.
* Not run if above code croak()s!
* …Run Code Online (Sandbox Code Playgroud) 如果我用一个我从未期望返回到perl的哈希编写一些XS代码,我是否必须释放它?如果是这样,怎么样?
我最接近的是hv_undef,但这只是清除哈希的内容,而不是我理解的哈希本身.
HV* hash = newHV();
...
use the hash
...
hv_undef(hash);
Run Code Online (Sandbox Code Playgroud) 无法找到此代码中发生内存泄漏的位置.
基本上我想为C函数编写一个XS包装器,它返回一个二维数组.
C函数:
int CW_returnArray(double** arrayDouble, int* count)
{
int number = 10;
int index, index1;
for(index = 0; index < number; index++)
{
for(index1 = 0; index1 < 10000; index1++)
{
arrayDouble[index][index1] = 12.51;
}
count[index] = 10000;
}
return number;
}
array -> output param to hold the two dimensional array
count -> output param to hold the number of element in each 1D array
Run Code Online (Sandbox Code Playgroud)
XS包装器:
void
returnArray()
PPCODE:
{
/** variable declaration **/
double** array;
int i …Run Code Online (Sandbox Code Playgroud) 给定一个使用C库的Perl XS模块,假设有一个正确设置的Makefile.PL,以便所有头和库位置,编译器和链接器标志等都能正常工作.
现在,假设我想要包含一个小型C程序,该程序包含使用相同底层C库的XS模块.什么是正确的,独立于平台的方式来指定目标可执行文件,以便使用相同的设置和标志构建它?
如果我做以下事情
sub MY::postamble {
return <<FRAG;
target$Config{exe_ext}: target$Config{obj_ext}
target$Config{obj_ext}: target.c
FRAG
}
Run Code Online (Sandbox Code Playgroud)
我没有得到我在参数中设置的那些包含位置,库列表等WriteMakefile.如果我开始手工编写规则,我必须考虑至少make,dmake和nmake.如果使用ExtUtils :: CBuilder,我无法想出指定要链接的库的直接方法.
我肯定错过了什么.如果你能指出的话,我将不胜感激.
我正在用Perl构建一个XS扩展.我有两个文件:
.h).c)目前我所做的是将所有C文件代码Model=放在XS文件之前并在之后包装我想要的函数Model=.
compliation没有问题,我可以从perl调用特定的函数.
但我想将.xs文件与C文件分开.
我希望.xs文件只包含wrap函数,这些函数将调用.c文件上的函数,但是当我这样做并运行dmake命令时,我得到错误代码129未定义引用'parse.c'文件.
我尝试使用C和OBJECT属性包含.c文件用于WriteMakerFile并仍然得到一个错误,任何想法如何将xs文件拆分为2个一个c文件和其他包含c函数的xs,它们是.c文件的一部分使用ExtUtils :: MakeMaker.
例子将不胜感激.
我最近开始使用perlxstut学习XS ,教程建议我使用旧的h2xs工具创建我的模块来创建一个基于ExtUtils :: MakeMaker的项目.但是对于纯Perl项目,h2xs/EUMM长期以来一直不赞成使用Module :: Install,Module :: Build或Dist :: Zilla.
是否有更现代的方式来创建XS项目?能模块::启动创建XS项目?Module :: Build或Dist :: Zilla可以构建XS项目吗?他们的pod页面对此事保持沉默.
另一方面,针对h2xs/EUMM的批评是否适用于XS项目?如果你还需要一个C编译器,那么要求make工具是否合理?
编辑:我看到这个问题回答了我关于创建项目的问题.我仍然想知道构建:EUMM是唯一的选择,还是Module :: Build和Dist :: Zilla也能够构建XS?
我有一个C++对象,我使用Perl XS转换为Perl.这个过程适用于Perl 5.8.5和5.8.7.但是当我尝试使用Perl 5.10.0时,我遇到了很多编译错误.他们中的大多数都是这样的:
undefined reference to 'PL_stack_max' undefined reference to 'PL_stack_sp' undefined reference to 'Perl_sv_2pv_flags' undefined reference to 'Perl_sv_setref_pv'
这告诉我,由于某种原因,Perl XS的东西没有正确链接.当我从5.8.5升级到v5.8.7时,我只需要更改版本并重新制作.
有小费吗?
perl ×10
perl-xs ×10
c ×4
makemaker ×2
memory-leaks ×2
xs ×2
destructor ×1
hp-ux ×1
module ×1
perl-module ×1
u2 ×1