Thread mittels xs static library aufrufen (2 answers)
Opened by ingobulla at 2008-08-19 23:27

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?

View full thread mittels xs static library aufrufen