Einsteigerprobleme mit SIP

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
snafu
User
Beiträge: 5536
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Freitag 24. April 2009, 07:46

Hi,

ich wollte mal SIP ausprobieren und bin gerade im Tutorial bei Punkt 4.1 (also noch ganz am Anfang).

Dort soll Python mit dem Headerfile word.h bekannt gemacht werden, das so aussieht:

Code: Alles auswählen

class Word {
    const char *the_word;

public:
    Word(const char *w);

    char *reverse() const;
};
Das zugehörige word.sip:

Code: Alles auswählen

%Module word 0

class Word {

%TypeHeaderCode
#include <word.h>
%End

public:
    Word(const char *w);

    char *reverse() const;
};


Um daraus ein Makefile zu machen, wird dieser Code für die configure.py verwendet:

Code: Alles auswählen

import subprocess
import sipconfig

build_file = 'word.sbf'

config = sipconfig.Configuration()

subprocess.call([config.sip_bin, '-c', '.', '-b', build_file, 'word.sip'])

makefile = sipconfig.SIPModuleMakefile(config, build_file)

makefile.extra_libs = ['word']

makefile.generate()
Das läuft auch soweit fehlerfrei durch. Das Problem entsteht erst beim Aufruf von make:

Code: Alles auswählen

~/tutorial/sip$ make
g++ -c -O2 -g -fPIC -Wall -W -I. -I/usr/include/python2.5 -o sipwordcmodule.o sipwordcmodule.cpp
g++ -c -O2 -g -fPIC -Wall -W -I. -I/usr/include/python2.5 -o sipwordWord.o sipwordWord.cpp
g++ -shared -Wl,--version-script=word.exp -o word.so sipwordcmodule.o sipwordWord.o -lword
/usr/bin/ld: cannot find -lword
collect2: ld returned 1 exit status
make: *** [word.so] Fehler 1
Kann mir jemand sage, was hier zu tun ist?
shcol (Repo | Doc | PyPi)
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Freitag 24. April 2009, 08:03

Was exakt zu korigieren ist kann ich erst mal nicht sagen.

In jedem Fall kann der Linker eine Bibliothek word (wahrscheinlich word.a oder word.lib) nicht finden. Diese müßte noch erstellt werden.

Andererseits sind beide Objects ja bereits vorher gebaut worden. Vielleicht kannst Du -lword auch einfach weglassen.
Benutzeravatar
snafu
User
Beiträge: 5536
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Freitag 24. April 2009, 08:27

Wenn ich -lword weglasse und das ganze installiere erhalte ich beim Import von `word`:

Code: Alles auswählen

ImportError: /usr/lib/python2.5/site-packages/word.so: undefined symbol: _ZNK4Word7reverseEv
shcol (Repo | Doc | PyPi)
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

Freitag 24. April 2009, 08:32

Jo dann wirst Du wohl die Bibliothek erstellen müssen. Und wenn ich mir das fehlende Symbol angucke, ist es wohl die word.sip, die irgendwie übersetzt/eingebunden werden muß.

Also alles Vermutung, ich kann auch daneben liegen.
lunar

Freitag 24. April 2009, 09:50

Naja, man sollte die Bibliothek, die man wrappen möchte, halt auch implementieren. D.h. vor dem Aufruf von SIP muss du eine Bibliothek namens word kompilieren. Wie du das machst, ist deine Sache, SIP wrappt nur, erstellt aber keine Bibliotheken.
Antworten