Smalltalk: dll mit C-Code einbinden

mueslirocker

Mitglied
Hallo,

ich habe ein kleines Programm in C++ geschrieben.
Eigentlich handelt es sich um ein Programm für Lex, aber ich brauche auch einige Klassen und daher wirds ein cpp statt c Programm.
Ich benutze Cygwin und entsprechend flex und gcc.

So, nun möchte ich mein Programm (hab die main von flex überschrieben) von einem Smalltalkprogramm aus starten und dachte mir, ich lager es also in eine dll aus.

Da kenn ich mich aber überhaupt nicht aus.
Via gcc -shared und dlltool hab ich nun auch eine dll und eine lib Datei gebastelt.
Ich bin mir aber nichtmal sicher, wie ich das in einem anderen C-Programm einbinden könnte.

Exportiert werden müsste ja eigentlich nur die main Methode (ich werde sie dann wohl umbenennen müssen/wollen), aber da gibts halt viele globale Variablen und sonstige Funktionen und sogar andere cpp Dateien, die ich mit einbinden muss.. weiß nicht, ob das Probleme geben könnte.
Beim gcc -shared hab ich alle Objektdateien eingebunden, die ich brauche und in der .def hab ich nur die Start-Methode angegeben.

Also meine Frage.
1.) Ist das bislang so korrekt?
2.) Wie binde ich nun diese .dll bzw .a bei Smalltalk dynamisch ein?
Linken beim Compilieren des Smalltalk Programms soll nicht nötig sein.
3.) Die gleiche Frage stellt sich bei einem C(++) Programm.
Dort konnte ich schon beim Compilieren linken, aber ich will dort auch dynamisch auf die Bibliothek zugreifen können (also quasi eine neue main, die die alte umbenannte aufruft, damit das Programm auch weiterhin von außen gestartet werden kann).

Man muss dazu sagen, dass ich von Smalltalk keine Ahnung habe.
Ich habe mit VisualWorks ein bisschen rumhantiert und mich durch ein Tutorial gearbeitet. Kenne also das Prinzip, aber das wars dann auch schon.
Habe noch was von "DLL and C Connect" gehört, bin mir aber nicht sicher, ob das Tool das richtige ist.
Ich möchte nur diese eine Startmethode mit den passenden Parametern aufrufen.

Ich hoffe, mir kann hier geholfen werden. :)


/edit
Okay, inzwischen habe ich ein bisschen mehr rausgefunden.
Mit dem "DLL and C Connect" Tool kann man eine neue Klasse erstellen.
Ich glaube man muss sie von der Superklasse Extern(al) ableiten (hab ich zumindest gemacht).
Dort kann man dann importierte Biblios angeben und Prozeduren als Interface deklarieren.
Man erstellt eine Instanz der neuen Klasse und diese kann dann die Funktion ausführen.
Klappt auch sehr gut, aber dynamisch ist das nicht gerade...
Ich weiß aber nicht, ob man bei Smalltalk anders (also dynamisch) Bibliotheken importieren kann.
 
Zuletzt bearbeitet:
Ich bin inzwischen ein bisschen weiter.
Wenn ich mit dem DLLCC Tool eine Klasse definiere, kann ich dort die Bibliotheken angeben und die externen Prozeduren definieren.
Nun kann ich eine Instanz der Klasse erzeugen und mit ihr die externe Methode aufrufen.
Auf die Klasse (oder deren Kategorie) kann ich ein "File out" machen.
Dann hab ich die Klassendeklaration in einem Parcelscript, das ich dynamisch per "File in" laden kann.

Einige Fragen/Probleme bleiben aber über.

Ich muss die Prozeduren von Hand definieren.
Dabei habe ich das Problem, dass beim DLLCC-Tool für Argumente nur Standard-Typen verwendet werden können.
Das höchste der Gefühle ist ein String.
Ich möchte aber ein File-Pointer (also *FILE) übergeben. In Smalltalk soll das Argument ein readStream sein.
Den Code kann man zwar verändern, allerdings legt DLLCC dann ein Typedef an, wo mein FILE auf void abgebildet wird. Entferne ich das Typedef, gibts n Fehler ("bad argument") beim Aufruf.

Müsste es nicht eine Möglichkeit bei DLLCC geben, die Methoden der .dll automatisch einzulesen (aus der .def zB)?
Dann müsste ich das nicht von Hand machen und könnte mir gleich mit anschaun, was mit nicht-Standard-Typen passiert.

Oh und eine (vorerst) letzte Frage hab ich noch.
Am liebsten würde ich gar keine Klasse erzeugen müssen.
Man kann C-Code auch ganz einfach ohne eine Klasse aufrufen.
Die Syntax sieht so (oder so ähnlich) aus.
<C: int foo(int x)>
Aber woher weiß Smalltalk dann, wo es diese externe Methode findet?
In der Klasse muss ich die Bibliothek angeben, aber beim einfachen Aufruf habe ich ja keine Möglichkeit dazu.

Kann mir jemand helfen?

/edit
Najut... ich glaub, das Thema kann abgehakt werden.

Automatisches Einlesen funktioniert sogar.. man muss dann die Header-Dateien haben.
Leider ist das ein wenig Overkill, da alle "includes" rekursiv mit geparst werden. Auch die Standard-Biblios.
Bei einem Versuch dahingehend ist VW abgeschmiert.
Nimmt man die "includes" raus, gibts natürlich wieder Probleme, da die Typen dann wieder unbekannt sind.

C-Aufrufe ohne eine Klasse gibt es auch nicht.
Die Aufrufe, die ich meinte, sind im Quellcode von dem externen Interface von DLLCC.
Stehen also nicht allein.

Soweit ich das Ganze überblicken konnte, müsste man in C(++) ein Stream-Objekt von Smalltalk nachbilden.
Das könnte man dann aber immernoch nicht in ein *FILE umwandeln.
Kurz um - es geht wohl nicht.

Ich übergebe jetzt einen String.
Bringt im Endeffekt das gleiche Ergebnis.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück