[C++] Globaler Kernel in Shared Objekt manipulierbar?

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Tejio
Establishment
Beiträge: 107
Registriert: 11.11.2010, 11:33

[C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von Tejio »

Hallo alle zusammen ;)

ich bin momentan am Experimentieren im Umgang mit C++ und stehe vor einem gedanklichen Stein. Ich habe die drei folgenden "Projekte":
  • Projekt 1 - Laufzeitumgebung
    • Eine Laufzeitumgebung. Sie macht im Moment nichts anderes, als ein Addon auszuführen und zu prüfen, ob sich der Globale Kernel geändert hat. Es wird mit der Bibliothek compiliert.
    Projekt 2 - Bibliothek
    • Eine statische Bibliothek. Sie bietet den Zugriff auf den Globalen Kernel.
    Projekt 3 - Addon
    • Ein kleines Addon, dass einige Klassen in den Globalen Kernel einfügt. Es wird ebenfalls mit der Bibliothek compiliert. Bei dem Addon handelt es sich um ein Shared Object.
Nun stehe ich vor dem Problem, dass sich Änderungen am Kernel im Addon nicht auf den Kernel in der Laufzeitumgebung auswirken. Ich programmiere in C++ unter Ubuntu, ohne Boost oder so, nur mit STL. Habt ihr eine Idee, was ich im Moment übersehe?

Code: Alles auswählen

typedef std::map<std::string, System*> StrToSystemMap;
class Kernel
{
  public:
    virtual ~Kernel();
    static Kernel& instance();
    System* get(std::string systemName);
    bool record(std::string name, System* system);
    unsigned int countRegistered();

  private:
    Kernel();
    Kernel( const Kernel& );
    void init();

    std::map<std::string, System*> mapSystems;
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von Krishty »

Was ist ein globaler Kernel

Wovon sprichst du

Programmierst du ein Betriebssystem, einen Browser oder einen Gauss-Filter?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Tejio
Establishment
Beiträge: 107
Registriert: 11.11.2010, 11:33

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von Tejio »

Tut mir leid für die Namensgebung und die wichtige Info:
ich programmiere momentan an einer experimentellen Spiele-Engine und möchte über die Addons meine Engine erweiterbar machen. Kernel bedeutet bei mir, dass jedes Addon Zugriff hat auf die grundlegenden Daten der Engine. Dazu gehören später zB. GraphicDriver, wie man sie aus Irrlicht kennt. Aber bevor ich mich mit der Spieleprogrammierung beschäftige, wollte ich zumindest ein Grundgerüst für mein zukünftiges Modell basteln. Der Sinn dahinter sei dahingestellt.

€dit:
@Krishty: Mensch, du wirst ja bald zwei Jahre alt :P (Seit dem 26.2.2009 bei zfx.info aktiv)
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von Krishty »

Ah, okay. Die Laufzeitumgebung liegt also in einer ausführbaren Datei und das Addon in einem Shared Object (was unter Windows eine DLL wäre, schätze ich).

Das Problem ist, dass jedes Modul seine eigene Kopie statischer Daten hat. Damit sind wahrscheinlich zwei Kernel-Instanzen aktiv; eine für jedes Modul. Das kann man umgehen, aber ich kenne mich mit was anderem als Windows nicht aus. Jemand anders zur Hilfe!
Tejio hat geschrieben:€dit:
@Krishty: Mensch, du wirst ja bald zwei Jahre alt :P (Seit dem 26.2.2009 bei zfx.info aktiv)
Ja. Falls Aramis es FR nicht mehr schafft, mich hier rauszuzerren, abzufüllen, und bis zum Morgengrauen mit der Schaufel in den Wald zu bringen (und euch das in seinem 1000. Post kundzutun), übernimm du das bitte.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Tejio
Establishment
Beiträge: 107
Registriert: 11.11.2010, 11:33

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von Tejio »

Du hast es erkannt. Und ja, leider hat jedes Modul seine eigene Instanz vom Kernel....
Könntest du mir bitte den Weg unter Windows erklären? Vielleicht lässt sich der Weg unter Linux auf eine ähnliche Weise rekonstruieren.

Ich schaue mal, was sich machen lässt. Könnte aber etwas verspätet sein, da ich Freitag Abend zu Besuch ins Krankenhaus muss.
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von Krishty »

Mit den Visual C++-spezifischen Schlüsselwörtern __declspec(dllexport) und __declspec(dllimport) kann man den Compiler anweisen, dass ein Modul nicht eigene Daten sondern die eines anderen Moduls benutzen soll. Speziell kannst du den Compiler damit anweisen, dass er die Funktion instance() aus der Laufzeitumgebung exportieren und in der dynamischen Bibliothek importieren soll, wodurch alle Addons dieselbe Funktion (die im Textabschnitt der Laufzeitumgebung) aufrufen und so denselben Kernel benutzen.

Überleg auch, ob eine globale Variable (ebenfalls in der Laufzeitumgebung als Export und in dem Addon als Import deklariert; üblicherweise automatisiert man das durch den Präprozessor) nicht der einfachere Weg wäre. Ich hasse Singletons.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von kimmi »

Mach doch deine Bibliothek zu einem Shared-Object anstelle einer Static Library. Oder spricht da irgend etwas dagegen?

Gruß Kimmi
Tejio
Establishment
Beiträge: 107
Registriert: 11.11.2010, 11:33

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von Tejio »

Dank euch beiden für eure Antworten.

@kimmi: Eine interessante Idee auf jeden Fall. Ich muss sie heute Abend mal ausprobieren. Ich melde mich auf jeden Fall, wenn es klappt ;)

@Krishty: Ich habe für Unix keine vergleichbaren Schlüsselwörter gefunden. Vielleicht versuche ich es mal mit anderen Suchbegriffen.....

Ich hab gestern zunächst einmal ein kleines Workaround gebastelt, wo jedes Addon bei der Initialisierung der Umgebung die geänderte Umgebung zurückgibt.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von kimmi »

Unter Unix brauchst du die export / import Schlüsselwörter auch ncht. Da wird alles exportiert beziehungsweise importiert.

Gruß Kimmi
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von Krishty »

kimmi hat geschrieben:Unter Unix brauchst du die export / import Schlüsselwörter auch ncht. Da wird alles exportiert beziehungsweise importiert.
Hast du Material dazu? Mich interessiert brennend, wie die Compiler das regeln …
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
klickverbot
Establishment
Beiträge: 191
Registriert: 01.03.2009, 19:22
Echter Name: David N.

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von klickverbot »

Wie meinst du »wie die Compiler das regeln«, Kristhy? Letztlich kommt es doch nur darauf an, auf welche Weise der Linker versucht, welche Symbole aufzulösen (strong/weak/undefined, etc.).

Wie ich dich kenne, hast du sicher wieder irgendeine spezielle, ausgefallene Frage… ;)
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von Krishty »

Wird ein Symbol importiert, bedeutet das, dass der Compiler das Symbol im Text nicht direkt adressieren darf sondern diese Adressierung indirekt durch einen Zeiger erfolgt, der beim Anfügen der dynamischen Bibliothek angepasst wird. (Gut zu sehen bei der Symboltabelle der Funktionen der C-Laufzeitbibliothek.) Insbesondere interessiert mich, woher der Compiler weiß, welche Symbole er auf diese Weise auslagern muss, wenn es ihm der Programmierer nicht mehr sagen kann – schlicht jede globale Variable und jede globale Funktion indirekt zu adressieren wäre ja der GAU.

Aber vielleicht bin ich da auch auf der falschen Fährte; mein Wissen zu diesem Thema auf nicht-Windows-Plattformen geht gegen Null.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8245
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von Krishty »

Gut

Also: unter Linux wird tatsächlich alles automatisch zusammengelinkt. Der Compiler optimiert nur diejenigen globalen Symbole, die programmintern deklariert sind – also static in C; namespace { in C++. Wieder was gelernt.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von kimmi »

Deswegen sind die meisten Export-Makros in den plattfomübergreifenden Engines für Linux / UNix auch leer. Unter Unix ist mit Shared-Objects eh einiges einfacher. Infos diesbezüglich Google + Unix-System-Programmierung. Das Buch "Unix-Systemprogrammierung" ist da meines Wissens auch das Standardwerk. Sehr empfehlendswert, das im Schrank zu haben, will man etwas portieren.

Gruß Kimmi
Tejio
Establishment
Beiträge: 107
Registriert: 11.11.2010, 11:33

Re: [C++] Globaler Kernel in Shared Objekt manipulierbar?

Beitrag von Tejio »

@kimmi: Dank für den Hinweis, zu dem Buch. Ich meine es in der Uni-Bibliothek gesehen zu haben.

@Kristy: Danke auch an dich. Aber ich schätze mal, ich sollte mich mehr mit der englischen Sprache beschäftigen....

Aaargh, ich hab den Vorschlag von kimmi voll vergessen (Erinnerung: Nutzung als Shared Objcet statt Static Object)
Ich bin froh, dass es euch beiden in diesem Forum gibt. Ihr helft mir sehr.
Antworten