Как я могу вызывать функции в другом исходном файле C из модуля Perl XS?

Я строю расширение XS с Perl. У меня есть два файла:

  1. файл заголовка C (.h)
  2. исходный файл 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