Anleitung: C++-Userprogramme



  • Auch wenn PrettyOS in C geschrieben ist, kann man mit relativ wenig Aufwand Userprogramme in C++ schreiben.

    Hier eine kleine Anleitung:

    Benötigt: PrettyOS (ohne gehts natürlich nicht ;)), Tools zum kompilieren von PrettyOS

    Als erstes kopieren wir das mitgelieferte Userprogramm (user_test_c) in einen neuen Ordner, den Ihr nennen könnt, wie Ihr wollt (vlt. user_test_cpp).

    In diesem Ordner benennen wir dann main.c in main.cpp um, da wir den Code ja als C++-Code kompilieren wollen. Im Code includen wir userlib.hpp statt .h; Diese Datei erzeugen wir nun:

    Dazu nehmen wir die userlib.h aus dem Ordner user/user_tools und duplizieren sie. Die Kopie nennen wir userlib.hpp. Um die Funktionsdeklarationen in dieser Datei setzen wir folgendes: extern "C" {/*Funktionsdeklarationen hier*/}
    Damit machen wir klar, das es sich um C-Funktionen handelt und sie entsprechend gelinkt werden.

    Jetzt fehlt nur noch ein entsprechend modifiziertes makefile:
    Fürs kompilieren unseres Codes (nicht die userlib.c) muss folgendes geändert werden:
    *.cpp statt *.c
    Zusätzliche Paramter:
    -fno-exceptions (gegen ___gxx_personality_v0-Fehler) (Danke an SHyx0rmZ (im IRC) für den Tipp)
    -fno-rtti (Schaltet RTTI ab) (Dank an MrN für den Tipp (Auch im IRC))

    Nicht mehr nötig seit Rev. 170:
    ^Paramter zu entfernen:
    -Werror (Wir kriegen Warnungen, für die ich bislang keine Lösung gefunden hab, von wegen deprecated conversion from constant string literal to char*)^

    Beachtet bitte ⚠ Die Zeile fürs kompilieren der Userlib im makefile braucht nicht geändert zu werden.

    Das wars eig. schon. Wenn ich was vergessen hab, sagt Bescheid 🙂

    Viel Spaß!

    mfg
    Mr X

    EDIT: Hinweise zu -Werror mit Hinweis versehen, da seit Rev. 170 irrelevant. Zudem gibt es seit Rev. 170 ohnehin ein C++-Skeleton-Prog (auf anubis2k5's Vorschlag).



  • Hallo Mr. X!

    Vielen Dank für die super Anleitung,

    dennoch habe ich (vielleicht) ein Verbesserungsvorschlag:

    Könnt ihr nicht ein "Skeleton" - User Programm in den Sourcen integrieren - mit vorbereiteter makefile und userlib.hpp?

    Ich bin der Meinung, das es den Workflow ungemein verbessern würde. Außerdem vereinfacht dies das erstellen von "fremden" Programmen.

    Wenn ich das richtig gesehen habe, sind die o.g. Schritte auch nur notwendig, wenn ein neues Programm erstellt wird.



  • Im IRC hatte ein gewisser mastamind, der sich scheinbar nicht im Forum registrieren will, einen Vorschlag (den ich nicht geprüft habe):

    <mastamind> MrN: bist du ein anderer als MrX?
    <mastamind> na egal. dass man sich im forum anmelden muss, um was zu schreiben, find ich echt lästig. so kann man nicht helfen.
    <mastamind> aber vielleicht liest das ja hier jemand. zu "Anleitung: C++-Userprogramme": ihr müsst nur die libsupc++ und die libgcc statisch dazu linken. dann sollten auch exceptions und rtti funktionieren. die warnung is simpel. ein string literal ist natürlich konstant, sodass man es keinem char* zuweisen kann. es muss const char* heißen.

    Anmerkung: Ich (Mr. N / MrN) bin nicht der gleiche wie Mr X / MrX.



  • Danke für die Rückmeldung, anubis2k5 und mastamind, und natürlich auch Dank an Mr. N fürs Weiterleiten von mastaminds Vorschlag!

    Das dazulinken irgendwelcher Libs halte ich für ungünstig, da sämtliche Standardbibliotheken meines Wissens nach nicht mit PrettyOS funktionieren.

    Danke für den const char*-Tipp. Das war die Ursache für die Warnungen. puts sollte m.E. einen const char* statt eines char* nehmen. Ich hab dies in Rev. 170 entsprechend geändert.

    Auch einen C++-Skeleton hab ich hochgeladen in Rev. 170.



  • Mr X schrieb:

    Das dazulinken irgendwelcher Libs halte ich für ungünstig, da sämtliche Standardbibliotheken meines Wissens nach nicht mit PrettyOS funktionieren.

    Die libsupc++ kenne ich nicht (da ich nicht mit C++ programmiere), aber die libgcc ist ungefährlich und enthält einfach Funktionen wie z. B. 64-Bit-Addition für 32-Bit-Rechner. Hier muss man allerdings aufpassen, dass man auf 64-Bit-Systemen die 32-Bit-libgcc hat und diese zum Linken verwendet.
    Diese libgcc ist also betriebssystemunabhängig und stellt einfach ein paar vom Compiler häufig verwendete Funktionen bereit.



  • Ich schlage dennoch vor, erstmal nicht diese Libs zu linken, wenn man diese Fkts. nicht braucht. Das hält Abhängigkeiten und Dateigröße gering 🙂



  • Mr X schrieb:

    Ich schlage dennoch vor, erstmal nicht diese Libs zu linken, wenn man diese Fkts. nicht braucht. Das hält Abhängigkeiten und Dateigröße gering 🙂

    Abgesehen davon wollen wir doch beim basteln von PrettyOS etwas lernen. Auch wenn ich beim Netzwerktreiber und USB - Unterstützung schon lange nicht mehr folgen kann, widdere ich doch meine Chance bei der Shell oder bei den User-Programmen - und wo bleibt denn der Spaß, wenn man auf Lib's zugreifen könnte???


  • Mod

    Auch wenn ich beim Netzwerktreiber und USB - Unterstützung schon lange nicht mehr folgen kann

    Das ist wirklich kompliziert. Ich werde versuchen, den Sourcecode besser zu dokumentieren, aber ohne EHCI 1.0 specification versteht man das nicht.



  • anubis2k5 schrieb:

    und wo bleibt denn der Spaß, wenn man auf Lib's zugreifen könnte???

    Ich weiß nicht, wo der Spaß verloren geht, wenn man eine Lib hat, die einem 42424242424242LL / 37 erlaubt (oder wo der Spaß ist, wenn man so eine Funktion selbst schreibt)...

    (Natürlich weiß ich nicht, ob man jetzt genau dafür die libgcc braucht, aber zumindest geht es in die Richtung)



  • "mastamind" hat im IRC grade geschrieben, wozu die libsupc++ da ist. Da die Frage hier aufkam, er aber nicht angemeldet ist, zitiere ich ihn mal:

    die libsupc++ enthält funktionen für die unterstützung von c++ features. rtti, exceptions und so zeug.


Anmelden zum Antworten