Thread mittels xs static library aufrufen
(2 answers)
Opened by ingobulla at 2008-08-19 23:27
Hallo,
ich habe eine shared library libcalcETP.a, die die Funktion [cpp] int abc() { return 37; } [/cpp] enthält, die zugehörige Header-Datei ist calcETP.h: [cpp] #ifndef CALCETP_H_ #define CALCETP_H_ int abc(); #endif[/cpp] Diese Funktion würde ich nun gerne in einem mittels XS erstellten Modul verwenden ("abc" soll also von den C-Dateien, die zum Bauen des Moduls verwendet werden, benutzt werden. es soll/braucht nicht möglich zu sein "abc" dann mittels des erstellten Moduls aus perl aufzurufen). Dazu bin ich vom "Set::Bit"-Beispiel in "XS Mechanics" (http://world.std.com/~swmcd/steven/perl/pm/xs/modu...) ausgegangen. Ich habe also 6 Dateien: vector.h: [cpp] typedef struct { int nBits; int nInts; int *pInts; } Vector; extern Vector *new (int nBits); ... [/cpp] vector.c: [cpp] #include "vector.h" #include <stdio.h> #include "calcETP.h" Vector *new(int nBits) { ... int s = abc(); ... } ... [/cpp] EmissionFreqs.pm: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 package EmissionFreqs; use strict; use vars qw($VERSION @ISA); require Exporter; require DynaLoader; @ISA = qw(Exporter DynaLoader); $VERSION = "1.01"; bootstrap EmissionFreqs $VERSION; 1; typemap: Code: (dl
)
EmissionFreqs T_PTROBJ EmissionFreqs.xs: [cpp] #include "EXTERN.h" #include "perl.h" #include "XSUB.h" #include "vector.h" typedef Vector *EmissionFreqs; MODULE = EmissionFreqs PACKAGE = EmissionFreqs PROTOTYPES: ENABLE EmissionFreqs new(package, nBits) char *package int nBits CODE: RETVAL = new(nBits); OUTPUT: RETVAL ... [/cpp] Makefile.PL: Code (perl): (dl
)
1 2 3 4 5 6 7 8 9 use ExtUtils::MakeMaker; WriteMakefile( 'NAME' => 'EmissionFreqs', 'VERSION_FROM' => 'EmissionFreqs.pm', # finds $VERSION 'LIBS' => '-L/home/ingo/workspace/calcETP/Debug -lcalcETP', 'DEFINE' => '', # e.g., '-DHAVE_SOMETHING' 'INC' => '-I/home/ingo/workspace/calcETP', 'OBJECT' => 'EmissionFreqs.o vector.o' ); Das Problem ist nun, dass, wenn ich Code (perl): (dl
)
my $a = new EmissionFreqs 100; verwende, die Fehlermeldung Code: (dl
)
/usr/bin/perl: symbol lookup error: /home/ingo/lib/perl5/site_perl/5.8.8/x86_64-linux-thread-multi/auto/EmissionFreqs/EmissionFreqs.so: undefined symbol: abc erhalte, obwohl perl ja "abc" eigentlich gar nicht braucht. libcalcETP.a funktioniert übrigens definitiv. Weiss jemand hier weiter? |