Как я могу вызывать функции в другом исходном файле C из модуля Perl XS?
Я строю расширение XS с Perl. У меня есть два файла:
- файл заголовка C (
.h
) - исходный файл C (
.c
)
в настоящее время то, что я сделал, это поместить весь код файла C перед Model=
в файле XS и оберните функции, которые я хочу после Model=
.
compliation работает без проблем, и я могу вызвать определенные функции из perl.
но я хочу отделить .xs
файл из файл c.
Я хочу .xs
файл, содержащий только функции переноса, и эти функции будут вызывать функции на .c
файл, но когда я это делаю и запускаю dmake
команда я получаю код ошибки 129 неопределенная ссылка на ' parse.файл c'.
Я попытался включить .C-файл с использованием свойств C и объекта для WriteMakerFile и по-прежнему получает сообщение об ошибке любая идея, как разделить файл xs на 2 один файл c и другой xs, которые обертывают функцию c, которые часть .файл c помощью ExtUtils::MakeMaker.
примеры будут оценены.
1 ответов
это на самом деле довольно проста:
Здравствуйте.h
#ifndef H_HELLO
const char *hello(void);
#define H_HELLO
#endif
Здравствуйте.c
const char *
hello(void) {
return "Hello";
}
пример.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-пример.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]$ prove -vb t/My-Example.t t/My-Example.t .. ok 1 - use My::Example; ok 2 - hello returns "Hello" 1..2 ok All tests successful. Files=1, Tests=2, 0 wallclock secs ( 0.04 usr 0.01 sys + 0.03 cusr 0.00 csys = 0.08 CPU) Result: PASS
The Makefile.PL
было создано h2xs
. Единственное, что я изменил, это раскомментировать следующую строку:
# Un-comment this if you add C files to link with later: OBJECT => '$(O_FILES)', # link all the C files too