Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]6679[/thread]

XS Modul in C++ nicht übersetzbar



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
sesth
 2005-02-01 13:50
#51473 #51473
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich verusche unter Windows 2000 mit ActiveState Perl 5.8.6 mit XS eine C++ Klasse einzubinden. Leider lassen sich die Header-Files von Perl nicht übersetzen. Vielleicht kann mir hier jemand helfen.

Unter Perl and C++ hatte ich ein entsprechendes Beispiel gefunden. Für Visual C++ 6.0 habe ich Makefile.PL dann noch etwas angepasst:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 => 'A. U. Thor <a.u.thor@a.galaxy.far.far.away>') : ()),
LIBS => [''], # e.g., '-lm'
DEFINE => '', # e.g., '-DHAVE_SOMETHING'
INC => '-I.', # e.g., '-I. -I/usr/include/other'
CCFLAGS => '-TP',
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
);


Die Header-Files von Perl erzeugen aber Fehler, da sie im C++-Mode nicht übersetzbar sind. Auch ein Klammern mit "extern C {}" hilft da nicht.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
    cl -c  -I.  -TP -MD -Zi -DNDEBUG -O1    -DVERSION=\"0.01\"  -DXS_VERSION=\"0.01\"  "-ID:\Perl\lib\CORE"   MyPackage.c
MyPackage.c
D:\Perl\lib\CORE\win32.h(314) : error C2061: syntax error : identifier 'Stat_t'
D:\Perl\lib\CORE\win32.h(413) : error C2143: syntax error : missing ',' before '*'
D:\Perl\lib\CORE\win32.h(413) : error C2059: syntax error : '*'
D:\Perl\lib\CORE\perlio.h(105) : error C2143: syntax error : missing ',' before '*'
D:\Perl\lib\CORE\perlio.h(105) : error C2059: syntax error : '*'
D:\Perl\lib\CORE\perlio.h(106) : error C2143: syntax error : missing ',' before '*'
D:\Perl\lib\CORE\perlio.h(106) : error C2059: syntax error : '*'
D:\Perl\lib\CORE\perlio.h(108) : error C2143: syntax error : missing ',' before '*'
...


Kann mir jemand einen Tipp geben, was ich falsch mache?

Gruß
Thomas
Gruß
Thomas
murphy
 2005-02-01 14:37
#51474 #51474
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Das einzige was mir auffällt, ist dass es extern "C" { ... } heißen muss; mit Anführungszeichen um das C herum -- aber das war wohl eher ein Tippfehler.

Funktioniert denn das Kompilieren von reinem C-XSUB-Code?
When C++ is your hammer, every problem looks like your thumb.
sesth
 2005-02-01 16:22
#51475 #51475
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Hallo Murphy

Ich verwende extern "C" (die vielen Anführungszeichen hätten nur verwirrt, dachte ich. Die XS-Datei beginnt folgedermassen:
Code: (dl )
1
2
3
4
5
#ifdef __cplusplus
extern "C" {
#endif
# include "EXTERN.h"
...

Um den C++-Mode zu erzwingen, ist die Option -TP gesetzt - damit behandelt VC++ alles als C++ Code. Lasse ich die Option weg, machen die Header keine Probleme mehr aber ich kann den dann folgenden C++-Code nicht mehr übersetzen.

Gruß
Thomas
Gruß
Thomas
murphy
 2005-02-01 19:31
#51476 #51476
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Seltsam, seltsam...

Ist denn das Präprozessormakro __cplusplus definiert?

Vielleicht solltest du ja auch nicht /TP sondern /Tp lokal für die eine Datei, die tatsächlich C++ Code enthält verwenden.

edit: also "cl /c /I . [...] /Tp MyPackage.c"

Ich kann das alles leider nicht austesten, weil ich kein Windows + MSVC zur Hand habe.\n\n

<!--EDIT|murphy|1107279267-->
When C++ is your hammer, every problem looks like your thumb.
esskar
 2005-02-01 19:34
#51477 #51477
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
poste mal dein zeugs, dann test ich es!
sesth
 2005-02-01 20:13
#51478 #51478
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
[quote=esskar,01.02.2005, 18:34]poste mal dein zeugs, dann test ich es![/quote]
Hier kommt mein Code, allerdings wird er beim Upload trotz der Code-Tags verändert bzw. verkürzt. Gibt es im Forum noch andere Möglichkeiten Code zu posten (Upload o.ä.)?

Makefile.pl
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
use 5.008004;
use ExtUtils::MakeMaker;

# 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 => 'A. U. Thor <a.u.thor@a.galaxy.far.far.away>') : ()),
LIBS => [''], # e.g., '-lm'
DEFINE => '', # e.g., '-DHAVE_SOMETHING'
INC => '-I.', # e.g., '-I. -I/usr/include/other'
CCFLAGS &nbsp
; => '-TP',
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
);


MyPackage.xs
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifdef cplusplus
}
#endif

#include <iostream.h>

class MyClass {
public:
MyClass(char * my_favorite_argument) {
cout << "I'm constructin' my bad self ... " << my_favorite_argument << "\n";
}
~MyClass() { cout << "Destruction is a way of life for me.\n"; }
};

MODULE = MyPackage PACKAGE = MyPackage

MyClass *
MyClass::new(char * my_favorite_argument)

void
MyClass::DESTROY()


Typemap
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
TYPEMAP
MyClass * O_OBJECT

OUTPUT
# The Perl object is blessed into 'CLASS', which should be a
# char* having the name of the package for the blessing.
O_OBJECT
sv_setref_pv( $arg, CLASS, (void*)$var );

INPUT
O_OBJECT
if( sv_isobject($arg) && (SvTYPE(SvRV($arg)) == SVt_PVMG) )
$var = ($type)SvIV((SV*)SvRV( $arg ));
else{
warn( \"${Package}::$func_name() -- $var is not a blessed SV reference\" );
XSRETURN_UNDEF;
}


Die Datei "perlobject.map" kann man im Makefile.pl auskommentieren, der Fehler kommt trotzdem.

Gruß
Thomas
Gruß
Thomas
esskar
 2005-02-01 20:44
#51479 #51479
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmm... schick mir mal die dateien
sesth
 2005-02-02 11:28
#51480 #51480
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Dateien sind unterwegs.

Gruß
Thomas
Gruß
Thomas
esskar
 2005-02-02 11:40
#51481 #51481
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
hmm...
hast wohl nicht h2xs benutzt!
Ich schau mir es genauer heute abend an. Bis später!
sesth
 2005-02-14 19:19
#51482 #51482
User since
2005-02-01
181 Artikel
BenutzerIn
[default_avatar]
Doch h2xs kam zum Einsatz. Ist Dir was auf- bzw. eingefallen?

Gruß
Thomas
Gruß
Thomas
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2005-02-01 13:50.