2012-04-03 11 views
1

Ich versuche SWIG zu verwenden, um Wrapper für einige meiner C++ - Funktionsaufrufe zu generieren.SWIG TCL Statische Verknüpfung

Ich versuche auch, meine eigene TCL-Shell zu erstellen, also muss ich die generierten SWIG-Bibliotheken statisch verknüpfen. Ich habe meine eigene Hauptfunktion mit einem Tcl_AppInit Anruf, wo ich einige vorherige Einrichtung mache.

Um dies zu tun, welche Funktion sollte ich in meinem Programm Tcl_AppInit Aufruf enthalten? Ich habe festgestellt, dass SWIG_init nicht die richtige Funktion ist. Ich habe sogar versucht Cell_Init wo Zelle ist der Name der Klasse in meinem Code, aber das hilft auch nicht.

Wie kann ich SWIG-Objektdateien mit meiner eigenen Hauptfunktion statisch verknüpfen und Tcl_Appinit aufrufen?

Zur Zeit, als ich den folgenden Befehl verwenden, um meinen executabel zu verknüpfen bekomme ich folgende Fehlermeldung:

g++ -o bin/icde src/core/*.o src/read/*.o src/swig/*.o src/icde/*.o -ltk -ltcl 

ich die folgende Fehlermeldung erhalten:

src/icde/main.o: In function `AppInit(Tcl_Interp*)': 
main.cpp:(.text+0xa9): undefined reference to `Cell_Init(Tcl_Interp*)' 
collect2: ld returned 1 exit status 

überprüfte ich die src/swig/Zelle. o Datei, die die Cell_Init Funktion hat oder nicht mit objdump:

~> objdump -d src/swig/cell.o | grep Cell_Init 
00006461 <Cell_Init>: 
    646c:  75 0a     jne 6478 <Cell_Init+0x17> 

bin ich nicht sicher, ob ich mache etwas falsch beim verlinken.

------------------- UPDATE -------------------------- -

Ich fand, dass einschließlich der swig/swig.cxx Datei direkt in der Hauptdatei, die die Tcl_AppInit Funktion aufruft, das Verknüpfungsproblem löst. Gibt es einen Grund dafür?

Ist es nicht möglich, die SWIG-Datei und die Datei mit der Hauptfunktion zu erstellen und separat zu verknüpfen?

+0

Als Reaktion auf Ihr Update ist es möglich, aber Sie haben eine der einfachsten Methoden. :-) –

Antwort

0

Im Allgemeinen, mit SWIG werden Sie mit einer Reihe von generierten Quelldateien, die Sie kompilieren. Die normale Sache, die Sie dann tun, ist sie in eine gemeinsame Bibliothek zu verpacken (mit entsprechenden gebundenen Abhängigkeiten von anderen gemeinsam genutzten Bibliotheken), die mit dem Befehl load in eine Tcl-Laufzeitumgebung importiert werden können.

Aber das wollen Sie diesmal nicht. Stattdessen möchten Sie die Objektdateien, die Sie verwenden würden, um diese freigegebene Lib zu erstellen, und Sie möchten sie in die Anweisungen aufnehmen, um eine ausführbare Datei zusammen mit der Objektdatei zu erstellen, die Ihre main und Tcl_AppInit enthält. Sie müssen auch sicherstellen, dass bei der Verknüpfung Ihrer Hauptdatei, die Sie machen es abhängig von diesen externen freigegebenen Bibliotheken; Für das ausführbare Erstellen müssen Sie alle Abhängigkeiten erfüllen und alle Symbole an ihre Definitionen binden. (Sie können eine statische Bibliothek verwenden, um dies zu vereinfachen: Sie kombiniert eine Menge von Objektdateien in einer Datei. Es gibt nur einen kleinen Unterschied, ob Sie nur die Objektdateien davon verwenden; insbesondere sind statische Bibliotheken nicht an ihre Abhängigkeiten gebunden.)

Schließlich möchten Sie tun möchten einen Anruf an Cell_Init in Ihrem Tcl_AppInit. Das ist der richtige Ort, um es zu sagen (solange Sie nicht dafür sorgen, dass das Paket in Sub-Interpreter geladen wird). Wenn es vorher versagt hat, war das, weil du deine Verbindung falsch gemacht hast. (Tipp: Linker funktionieren am besten, wenn Objekte und Bibliotheken auf der Verbindungslinie nur von Dingen später auf der Verbindungslinie abhängen.Die Link-Reihenfolge richtig zu bekommen ist ein bisschen eine schwarze Kunst, wenn Sie einen komplexen Build haben!)

+0

OK, es gibt mehr Komplexität, die ich nicht behandelt habe, wie schwach gebundene Symbole und die nicht-triviale Definition von "Bindung", aber Sie können das jetzt ignorieren. Das Verständnis dieser Teile wird dir nicht helfen, deinen Code zu verlinken und zu arbeiten! –

+0

Ich habe alles gemacht, was du erwähnt hast. Ich überprüfe sogar die Objektdateien, um sicherzustellen, dass die CellInit-Funktionsaufrufe mit dem Befehl objdump existieren. Ich habe Link-Befehl im obigen Beitrag hinzugefügt. Kannst du mich wissen lassen, was ich falsch mache? –

+0

Hmm, könnte sein, dass es in einer C++ - verständnisvollen Weise verknüpft werden muss. Meine Kenntnisse in C++ - Praktika sind sehr wackelig (Tcl selbst wird aus gutem Grund in reinem C gemacht). Wenn Sie etwas gefunden haben, das funktioniert, gehen Sie mit! –