Sie können clang als Bibliothek verwenden, um die JIT-Kompilierung wie in anderen Antworten beschrieben zu implementieren. Dann müssen Sie das kompilierte Modul laden (sagen wir, eine .so-Bibliothek).
Um dies zu erreichen, können Sie standard dlopen (unix) oder LoadLibrary (windows) verwenden, um es zu laden, dann dlsym (unix) verwenden, um kompilierte Funktionen dynamisch zu referenzieren, sagen wir eine "main()" - ähnliche Funktion dessen Name bekannt ist. Beachten Sie, dass Sie für C++ verstümmelte Symbole verwenden müssen. Eine tragbare Alternative ist z.B. GNUs libltdl.
Als Alternative kann das "Skript" automatisch zur Ladezeit ausgeführt werden, indem Modul-Init-Funktionen implementiert werden oder statischer Code eingefügt wird (der Konstruktor eines C++ - global definierten Objekts würde sofort aufgerufen).
Das geladene Modul kann direkt in der Hauptanwendung alles aufrufen. Natürlich sind die Symbole zum Zeitpunkt der Kompilierung bekannt, wenn die Header-Dateien der Haupt-App verwendet werden.
Wenn Sie einfach C++ "Plugins" zu Ihrem Programm hinzufügen möchten und die Komponentenschnittstelle a priori kennen (sagen Sie, dass Ihre Hauptanwendung den Namen und die Schnittstelle einer geladenen Klasse von ihrer .h kennt, bevor das Modul in den Speicher geladen wird)), nachdem Sie die Bibliothek dynamisch geladen haben, ist die Klasse verfügbar, als ob sie statisch verknüpft wäre. Sei nur sicher, dass du nicht versuchst, das Objekt einer Klasse zu instanziieren, bevor du sein Modul dlopen().
Die Verwendung von statischem Code ermöglicht es, auch automatische automatische Registrierungsmechanismen zu implementieren.
Vielen Dank. Es hat eine ganze Weile gedauert, bis ich es fertiggestellt habe - im Grunde, weil ich die ausführbare Datei nicht gefunden habe. Jetzt, nachdem ich sie angeschaut habe, würde ich sagen, dass es auf halbem Wege ist. Jetzt muss ich herausfinden, wie man Funktionen aufruft, die im Nicht-Jitted-Teil definiert sind. ... irgendwelche Ideen dazu? – FFox
Ich bin mir nicht sicher, was du meinst. Sie sollten in der Lage sein, einen Zeiger auf jede Funktion zu erhalten, die Sie kompiliert haben. Vielleicht wäre dieses allgemeine LLVM-Tutorial hilfreich: http://llvm.org/docs/tutorial/ (insbesondere Kapitel 4). Ich erwarte nicht, dass Sie diesen Interpreter so verwenden können, wie er ist, aber er sollte Ihnen eine Vorstellung davon geben, wie Sie einen C/C++ - Interpreter in Ihre Anwendung einbetten können. (Ich habe es nicht einmal selbst benutzt; ich erinnere mich nur daran, es gesehen zu haben.) –
Ok, hier ist, was ich getan habe: http://lists.cs.uiuc.edu/pipermail/cfe-dev/2010-July/009836.html ... und es hat tatsächlich mit Hilfe der netten Leute von der cfe-dev Mailingliste geklappt. Warum kann dieser Interpreter nicht in einer App verwendet werden? – FFox