Dynamisches Einladen neuer Funktionalitaeten in C++
-
Hallo,
Ist es in C++ moeglich dynamisch, unter Runtime, neuen (vorkompilierten) Code einzuladen in ein Programm?
Mein Programm soll auf versch. vernetzten embedded Systemem laufen und ich suche momentan einen Weg, zusaetzliche Funktionalitaet in Form von "Upgrades" einzuspielen, zB Ein Programm das bisher nur Kuchen backen konnte, bekommt ein Upgrade und statt weiterhin Kuchen zu backen, repariert es nun Autos. Es sollte natuerlich nicht auf dem System selber nachkompiliert werden (Platz).
Evtl. gibt es fuer diese Funktionalitaet ja auch schon irgendeine Library, bspw. etwas unter Boost. Ich hatte evtl. MPI oder Serialize mal gesehen, hab aber damit bisher keine Erfahrung.
-
Fabeltier schrieb:
Ist es in C++ moeglich dynamisch, unter Runtime, neuen (vorkompilierten) Code einzuladen in ein Programm?
In Form von Bibliotheken ("windows".dll, "linux".so, ...) lässt sich Code dynamisch laden.
Wobei es evtl sinnvoller wäre die gesamte Applikation neu zu übersetzen, kommt aber auch auf die Anforderungen an das embedded System an. (Bzw dessen Möglichkeiten.)Wenn du allerdings mehrere verschiedene Konfigurationen brauchst und ausreichend Leistung hast. Per Bibliotheken lassen sich halt quasi als Plugin verschiedene Konfigurationen individuell zusammenstellen.
Wobei statt Kuchen backen, Autos reparieren schon etwas komplett anderes, sprich ein anderes Programm wäre... sag doch mal etwas genauer, was du an einem Programm ändern willst und was erhalten bleiben soll und was das für "versch. vernetzte embedded Systeme" sind.
-
Fabeltier schrieb:
Ist es in C++ moeglich dynamisch, unter Runtime, neuen (vorkompilierten) Code einzuladen in ein Programm?
Mit ANSI C++ garnicht (dll/shared lib usw. sind Plattformabhängig).
Welche Mechanismen unter embedded Systemen hierfür existieren kann ich dir nicht sagen. Unter Windows würde man hierzu dynamische Bibliotheken (dll) zur Laufzeit über festgelegte Funktionen binden (GetProcAddress & Co). Das würde aber in ein anderes Unterforum gehören.
-
Gut, an .so (Linux/Unix) hatte ich auch schon gedacht. Allerdings geht es teilweise einfach nur um Kleinigkeiten, zB ergaenzen einer neuen Funktion, oder einen neuen Functor in eine Liste bestehender aufzunehmen, wobei alles in dieser Liste dann abgearbeitet wird. Ausserdem sind Shared Objects dann ja natuerlich wieder platformabhaengig, weshalb ich, irgendwie an was mit Boost, dachte.
Wobei die Plattformabhaengigkeit hier wohl auch nicht so dramatisch waere. Naja, ich werd mir mal die Moeglichkeiten mit Shared Objects naeher ansehen.
-
Fabeltier schrieb:
Ausserdem sind Shared Objects dann ja natuerlich wieder platformabhaengig, weshalb ich, irgendwie an was mit Boost, dachte.
Und wie hätte es boost lösen sollen? Boost ist auch nur C++ und kann nicht zaubern (wobei es durchaus eine gewisse Templatemagie besitzt)...
Ich kenne keine compilierte Sprache die dynamische Erweiterungen ohne Bibliotheksmechanismen erlaubt.
-
Das einfachste wäre in deinem Fall Scripting. Ein zentrales Repo für Scripte, aus dem sich die einzelnen Applikationen bedienen können. Du kannst dann beliebig ein Script zur Laufzeit herunterladen und starten. Funktioniert komplett ohne Dll usw., ist also plattformunabhängig
Schau dir mal LUA an

http://www.lua.org
-
Scripting ist auch der momentane Ansatz. Ein Script, das in XML verpackt ist wird uebertragen und vor Ort ausgefuehrt. Ich werde mir mal den Weg mit Shared Objects etwas weiter ansehen. Mal sehen wie gross der Aufwand ist. Danke fuer die Infos.