标签: perl-xs

从头开始创建XS模块的现代方法是什么?

我需要为Perl编写一个XS模块.据我所知,今天h2xs已被大家弃用,今天启动XS模块的首选方法是什么?我查看了Module :: Starter,但它只处理纯Perl模块.

perl perl-xs

17
推荐指数
2
解决办法
787
查看次数

在嵌入式C应用程序中从Perl调用C函数

好吧,这是一个非常有趣的问题,并且可能没有任何简单的方法可以做到这一点,但想到我会在决定修改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)

这不能是外部库的原因是因为我依赖于仅在应用程序中创建/存储的数据.

c perl perl-xs

12
推荐指数
1
解决办法
2317
查看次数

扩展Perl正在打破动态加载

我正在尝试将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)

perl hp-ux perl-xs u2

10
推荐指数
1
解决办法
1005
查看次数

安全地释放XS代码中的资源(在范围退出时运行析构函数)

我正在写一个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)

c perl destructor perl-xs xs

9
推荐指数
1
解决办法
163
查看次数

我是否必须释放使用newHV创建的HV*?

如果我用一个我从未期望返回到perl的哈希编写一些XS代码,我是否必须释放它?如果是这样,怎么样?

我最接近的是hv_undef,但这只是清除哈希的内容,而不是我理解的哈希本身.

HV* hash = newHV();
...
use the hash
...
hv_undef(hash);
Run Code Online (Sandbox Code Playgroud)

perl memory-leaks perl-xs

8
推荐指数
2
解决办法
334
查看次数

此代码中的XS内存泄漏?

无法找到此代码中发生内存泄漏的位置.

基本上我想为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 memory-leaks perl-xs xs

8
推荐指数
1
解决办法
567
查看次数

使用Perl的ExtUtils :: MakeMaker,如何使用与我的XS模块相同的设置编译可执行文件?

给定一个使用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,dmakenmake.如果使用ExtUtils :: CBuilder,我无法想出指定要链接的库的直接方法.

我肯定错过了什么.如果你能指出的话,我将不胜感激.

c perl makemaker perl-xs

8
推荐指数
1
解决办法
404
查看次数

如何从Perl XS模块调用不同C源文件中的函数?

我正在用Perl构建一个XS扩展.我有两个文件:

  1. AC头文件(.h)
  2. AC源文件(.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.

例子将不胜感激.

perl perl-module perl-xs

8
推荐指数
1
解决办法
616
查看次数

哪些工具可以帮助构建XS项目?

我最近开始使用perlxstut学习XS ,教程建议我使用旧的h2xs工具创建我的模块来创建一个基于ExtUtils :: MakeMaker的项目.但是对于纯Perl项目,h2xs/EUMM长期以来一直不赞成使用Module :: Install,Module :: BuildDist :: Zilla.

是否有更现代的方式来创建XS项目?能模块::启动创建XS项目?Module :: Build或Dist :: Zilla可以构建XS项目吗?他们的pod页面对此事保持沉默.

另一方面,针对h2xs/EUMM的批评是否适用于XS项目?如果你还需要一个C编译器,那么要求make工具是否合理?

编辑:我看到这个问题回答了我关于创建项目的问题.我仍然想知道构建:EUMM是唯一的选择,还是Module :: Build和Dist :: Zilla也能够构建XS?

perl module makemaker perl-xs

7
推荐指数
1
解决办法
838
查看次数

使用Perl 5.10编译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 perl-xs

6
推荐指数
1
解决办法
1480
查看次数

标签 统计

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