Как взаимодействовать с C ++ и Perl с помощью XS?

Это школьная вещь.

Вот проблема:

Мы работаем над клоном Bomberman, и нам нужно реализовать интерфейс сценариев, позволяющий пользователю создавать собственный «искусственный интеллект».
Мы решили использовать Perl. Прямо сейчас я собираю модуль perl следующим образом:

Вот файлы (цель теста):

SaibApi.xs:

#ifdef  __cplusplus
extern "C" {
#endif
#include "EXTERN.h"#include "perl.h"#include "XSUB.h"#ifdef  __cplusplus
}
#endif
#include "ppport.h"#include "SaibApi.hpp"
MODULE = SaibApi                PACKAGE = SaibApi

SaibApi *
SaibApi::new()

void
SaibApi::DESTROY()

void
SaibApi::PrintLol()

void
SaibApi::PrintPvar()

void
SaibApi::setLol(int arg)

SaibApi.hpp

#ifndef         SAIBAPI_HPP_
# define        SAIBAPI_HPP_

#include <iostream>

class           SaibApi {
public:
SaibApi() {}
~SaibApi() {}
void          PrintLol() { std::cout << "lol\n"; }
void          PrintPvar() { std::cout << _lol << "\n"; }
void          setLol(int arg) {_lol = arg;}
private:
int           _lol;
};

#endif          /* !SAIBAPI_HPP_ */

Makefike.PL:

use 5.014002;
use ExtUtils::MakeMaker;

my $CC =                'g++';

# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
NAME              => 'SaibApi',
VERSION_FROM      => 'lib/SaibApi.pm', # finds $VERSION
PREREQ_PM         => {}, # e.g., Module::Name => 1.1
($] >= 5.005 ?     ## Add these new keywords supported since 5.005
(ABSTRACT_FROM  => 'lib/SaibApi.pm', # retrieve abstract from module
AUTHOR         => 'Arkeopix <arkeopix@>') : ()),
LIBS              => [''], # e.g., '-lm'
DEFINE            => '', # e.g., '-DHAVE_SOMETHING'
INC               => '-I.', # e.g., '-I. -I/usr/include/other'
# Un-comment this if you add C files to link with later:
# OBJECT            => '$(O_FILES)', # link all the C files too
CC                => $CC,
LD                => '$(CC)',
XSOPT             => '-C++',
TYPEMAPS          => ['perlobject.map'],
);

Для ясности я исключил файлы типов карт.

Модуль правильно построен, и я могу создать экземпляр класса SaibApi в Perl.
Теперь наша проблема в том, что, очевидно, нет способа создать экземпляр класса в c ++ и в perl одновременно. Мы пытаемся предоставить пользователю простой API, позволяющий получать объекты из нашего кода C ++ (много std :: list, содержащих карты, игроков и т. Д.) Простыми методами.

например:

#! /usr/bin/perl -w
#use SaibApi;

my $ai = new SaibApi();
my @map = ai->GetMap();
# some more code here...

Мы провели много исследований, но документации по XS немного. Мы застряли прямо сейчас. Как создать экземпляр класса в c ++ и в perl одновременно, позволяя установить _lol в части C ++ и распечатать его в части Perl без использования SetLol() метод? И если это невозможно, каковы альтернативы?

2

Решение

Я бы порекомендовал использовать ExtUtils :: XSpp а также Модуль :: Строить :: WithXSpp. они значительно облегчают взаимодействие с C ++.

1

Другие решения

В итоге мы решили пойти с общей памятью, потому что сроки подходят очень быстро.

Сначала мы создаем сегмент памяти с shmget(), поделитесь нашими данными с shmat() а затем поместите содержимое наших списков в стек сценариев с помощью XPUSHs(),

Может быть, это не самый красивый способ сделать это, но он работает довольно хорошо.

0

По вопросам рекламы [email protected]