XS C++ return class pointers
[email protected] (James Shirley)
| Newsgroups | perl.xs |
|---|---|
| Message-ID | <[email protected]> |
Hi, I'm trying to write a XS routine to return a point to a c++ class to be
accessible from perl..
I'm new to XS, so i've been following:
http://www.johnkeiser.com/perl-xs-c++.html
and
http://search.cpan.org/~dmr/CookBookB-19960430/
However when I try make the xs generated code, i get the following compiler
error:
g++ -c -I. -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fno-strict-aliasing -pipe
-fstack-protector -I/usr/local/include -D_LARGEFILE_SOURCE
-D_FILE_OFFSET_BITS=64 -O2 -g -DVERSION=\"0.01\" -DXS_VERSION=\"0.01\"
-fPIC "-I/usr/lib/perl/5.10/CORE" MyPackage.c
MyPackage.c: In function ‘void XS_MyPackage_child(PerlInterpreter*, CV*)’:
MyPackage.c:168: error: ‘CLASS’ was not declared in this scope
make: *** [MyPackage.o] Error 1
I assume I'm doing something wrong in the child method, however i lifted
this code out of one of the CookBookB examples..
MyClass *
MyClass::child()
CODE:
RETVAL = (MyClass *)safemalloc( sizeof(MyClass) );
*RETVAL = THIS->child();
OUTPUT:
RETVAL
CLEANUP:
safefree(RETVAL);
Any help would be much appreciated.
I have the following code:
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#include "ppport.h"
#ifdef __cplusplus
extern "C" {
#endif
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
#ifdef __cplusplus
}
#endif
#undef list
#include <iostream>
class MyClass;
class MyClass {
private:
int _id;
public:
MyClass(int id) {
_id = id;
}
~MyClass() { }
void operator =(const MyClass &other) {
_id = other._id;
}
int id() {
return _id;
}
MyClass child() {
return MyClass(5);
}
};
MODULE = MyPackage PACKAGE = MyPackage
MyClass *
MyClass::new(int id)
void
MyClass::DESTROY()
MyClass *
MyClass::child()
CODE:
RETVAL = (MyClass *)safemalloc( sizeof(MyClass) );
*RETVAL = THIS->child();
OUTPUT:
RETVAL
CLEANUP:
safefree(RETVAL);
With the Makefile.PL:
use 5.010001;
use ExtUtils::MakeMaker;
$CC = 'g++';
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
WriteMakefile(
NAME => 'MyPackage',
VERSION_FROM => 'lib/MyPackage.pm', # finds $VERSION
PREREQ_PM => {}, # e.g., Module::Name => 1.1
($] >= 5.005 ? ## Add these new keywords supported since 5.005
(ABSTRACT_FROM => 'lib/MyPackage.pm', # retrieve abstract from module
AUTHOR => 'James <james@>') : ()),
LIBS => [''], # e.g., '-lm'
DEFINE => '', # e.g., '-DHAVE_SOMETHING'
INC => '-I.', # e.g., '-I. -I/usr/include/other'
CC => $CC,
LD => '$(CC)',
XSOPT => '-C++',
TYPEMAPS => ['perlobject.map' ],
# Un-comment this if you add C files to link with later:
# OBJECT => '$(O_FILES)', # link all the C files too
);
and the typemap:
TYPEMAP
MyClass * O_OBJECT
Cheers James