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

mittels xs static library aufrufen

Leser: 1


<< >> 3 Einträge, 1 Seite
ingobulla
 2008-08-19 23:27
#113718 #113718
User since
2008-08-08
20 Artikel
BenutzerIn
[default_avatar]
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?
murphy
 2008-08-20 02:31
#113722 #113722
User since
2004-07-19
1776 Artikel
HausmeisterIn
[Homepage]
user image
Hmm, ja was denn nun?

Im Titel sagst Du, Du hast eine statische Bibliothek, dann schreibst Du im Beitrag, sie sei dynamisch, habe aber ein .a im Dateinamen.

Erst sagst Du, dass Du eine C-Funktion namens abc verwenden willst, dann taucht diese Funktion in Dem von Dir geposteten XS-Code nirgends auf.

Und schließlich verlierst Du auch kein Wort darüber, was denn nun nicht funktioniert und was schon. Es ist auf den meisten Unices nicht ungewöhnlich, dass dynamisch gelinkte Symbole in einer dynamischen Bibliothek von nm als undefiniert markiert werden – das deutet zwar darauf hin, dass die Bibliothek calcETP tatsächlich dynamisch ist, oder vielleicht nicht die Bibliotheksdatei gelinkt wird, die Du glaubst zu linken, aber es sagt nichts darüber aus, ob der Linker beim Produzieren des XS-Modules irgendwelche Warnungen von sich gegeben hat, ob Perl das Modul laden kann und ob die Funktion abc aufgerufen werden kann.

Irgendwie ist es ohne hellseherische Fähigkeiten schwierig nachzuvollziehen, wo Dein Problem liegt. Meine Glaskugel meint, dass Du vielleicht mal die Linkerflags genau überprüfen oder einfach ausprobieren solltest, ob das Modul nicht sogar funktioniert, obwohl nm komische Dinge sagt ;-)
When C++ is your hammer, every problem looks like your thumb.
ingobulla
 2008-08-20 12:22
#113734 #113734
User since
2008-08-08
20 Artikel
BenutzerIn
[default_avatar]
Da ist in der Tat gestern abend einiges durcheinander gegangen. Ich habe den Beitrag umformuliert.

Ich sollte wohl noch erwähnen, dass libcalcETP.a die static library ist, die die Funktion "abc" enthält, während EmissionFreqs.so die automatisch von XS erstellte shared library ist.
<< >> 3 Einträge, 1 Seite



View all threads created 2008-08-19 23:27.