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

问题描述 投票:7回答:2

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

  1. A C头文件(.h
  2. A C源文件(.c

[目前,我要做的是将所有C文件代码放在XS文件上的Model=之前,并将我想要的功能包装在Model=之后。

该编译没有问题,我可以从perl调用特定的函数。

但是我想将.xs文件与C文件分开。

我希望.xs文件仅包含包装函数,并且这些函数将调用.c文件上的函数,但是当我这样做并运行dmake命令时,我得到了错误代码129未定义的引用'parse.c'文件。

[我尝试使用WriteMakerFile的C和OBJECT属性包含.c文件,并且仍然不清楚如何将xs文件拆分为2个,一个c文件,另一个包装c函数的其他xs,这是一个错误。 c文件,使用ExtUtils::MakeMaker

示例将不胜感激。

perl perl-module perl-xs
2个回答
9
投票
这实际上很简单:

hello.h

#ifndef H_HELLO const char *hello(void); #define H_HELLO #endif
hello.c

const char * hello(void) { return "Hello"; }
Example.xs

#define PERL_NO_GET_CONTEXT #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "ppport.h" #include "hello.h" MODULE = My::Example PACKAGE = My::Example PREFIX = MY_ PROTOTYPES: DISABLE const char * MY_hello() CODE: RETVAL = hello(); OUTPUT: RETVAL
t / My-Example.t

use strict; use warnings; use Test::More; BEGIN { use_ok('My::Example') }; is(My::Example::hello(), 'Hello', 'hello returns "Hello"'); done_testing;
[~~ tmp / My-Example] $证明-vb t / My-Example.tt / My-Example.t ..好的1-使用My :: Example;ok 2-hello返回“ Hello”1..2好所有测试均成功。文件= 1,测试= 2,0壁钟秒(0.04 usr 0.01 sys + 0.03 cusr 0.00 csys = 0.08 CPU)结果:PASS
Makefile.PLh2xs生成。我唯一更改的是取消注释以下行:

#如果要添加C文件以便以后与之链接,请取消注释:OBJECT =>'$(O_FILES)',#也链接了所有C文件


0
投票
我认为这是一篇比较老的文章,但我承认关键是正确的目录结构和文件放置。您必须将其他.c源文件放入xs文件所在的目录中。并将您的xs文件放入Makefile.PL所在的目录中。 (我假设您没有在Makefile.PL中将MULTIXS设置为1)。此放置限制的原因是,生成的Makefile中的CCCMD编译命令没有-o选项,因此所有输出目标文件都将放置在生成的Makefile所在的目录中。在CPAN上,我发现/检查了一些模块,这些模块的源文件位于与xs文件不同的子目录中,但是它们覆盖了ExtUtils :: MakeMaker const_cccmd子目录,并在Makefile生成过程中即时添加-o选项。
© www.soinside.com 2019 - 2024. All rights reserved.