Eigene Header verwenden ohne sie zum projekt hinzuzufügen



  • hi leute 🕶

    was muss ich tun damit ich nicht zusätzlich zu #include <myheader.h> auch noch extra unter (MS VS 2005) projekt | vorhandenes element hinzufügen ... die header angeben muss? is ja normal nicht so tragisch aber momentan verwende ich eine klasse die von einer anderen klasse abgeleitet wurde, die von einer anderen klasse abgeleitet wurde, usw. bei jeder klasse muss ich mindestens den header zum projekt hinzufügen, wenn ich dann noch die dazugehörige .cpp datei öffne wirds mit 8+ offenen dateien schnell unübersichtlich. gibt es da eine möglichkeit das so wie in der standardbibliothek umzusetzten ?



  • Eigentlich *muss* man keine Header dem Projekt hinzufügen.
    Es reicht aus, wenn der Pfad zu den Headern bekannt ist oder man anstelle von "<name.h>" einfach "name.h" schreibt 😉



  • Jochen Kalmbach schrieb:

    Eigentlich *muss* man keine Header dem Projekt hinzufügen.
    Es reicht aus, wenn der Pfad zu den Headern bekannt ist oder man anstelle von "<name.h>" einfach "name.h" schreibt 😉

    pfad ist bekannt aber trotzdem wills beim MS VS 2005 express nicht klappen oder hat da jemand andere erfahrungen gemacht? es macht einen unterschied ob ich einfach schreibe test_funcxyz() (nirgendwo definiert - Fehler: unbekannter bezeichner test_funcxyz) oder test_func1() (in einem eingebundenen header definiert, header is aber nicht teil des projekts - Linkerfehler: undefined reference to test_func1 ...). Klappen tuts bei mir nur wenn ich es dem projekt hinzufüge...



  • Naja, entweder willst du etwas, was nicht geht, oder du machst es falsch. Beispiel: du hast eine Header-Datei, die du gerne in allen deinen Projekten erreichen willst.

    1. Du mußt diese in ein für dich selbst definiertes alltägliches Verzeichnis ablegen.

    + C:\
      |
      + MyCommonsLibs
        |
        + Hyper
          |
          + HyperHyper.hpp
            DuperDuper.hpp
    

    2. Du mußt das Verzeichnis "C:\MyCommonsLibs" in die Optionen von MSVC eintragen.
    3. Du mußt die Header in deinen Projekten inkludieren.

    #include <Hyper/HyperHyper.hpp>
    #include <Hyper/DuperDuper.hpp>
    

    Wichtig: spitze Klammern benutzen!!! Anführungsstriche sind nur für Header im eigenen Projekt.
    Ist doch einfach? Wenn du noch eine LIB-Datei zu Hyper hast (weil es keine Templates sind), kannst du die z.B. in ein "C:\MyCommonsLibs\Hyper\Lib" ablegen, und diesen Pfad ebenfalls in den MSVC-Optionen eintragen. Mußt du aber immer in die richtige Kategorie eintragen!!!

    Undefined Reference ist ein Linkerfehler! D.h. du hast die LIBRARY-Datei vergessen. Die mußt du natürlich vorher bauen, ablegen und in den Projekt-Einstellungen (Linker->Eingabe->Abhängigkeit) eintragen. Die Headers alleine nützen nichts.



  • das heisst ich MUSS zu jedem header auch noch eine lib bauen? reicht es nicht aus den header ganz normal mit einzubinden (pfad ist bekannt, error kommt weiterhin)?



  • Du MUSST zu jeder .cpp, die du nicht in dein Projekt einbindest eine entsprechende Objektdatei haben und es MUSS die Implementierungn jeder Funktion entweder in einer .cpp oder einer Objektdatei eingebunden werden.

    Der Header enthält ja (fast immer) nur die Deklaration



  • darthdespotism schrieb:

    Du MUSST zu jeder .cpp, die du nicht in dein Projekt einbindest eine entsprechende Objektdatei haben und es MUSS die Implementierungn jeder Funktion entweder in einer .cpp oder einer Objektdatei eingebunden werden.

    widerspricht sich das nicht irgendwie?

    darthdespotism schrieb:

    Der Header enthält ja (fast immer) nur die Deklaration

    jo bei mir auch 😉 habe aber die .cpp datei nirgendwo explitzit eingebunden, kann das der fehler sein?



  • Naja, natürlich ist das der Fehler! Habe ich doch gesagt! Auch darthdespotism versucht dir das zu sagen.

    cpp -> Sourcecodedatei.
    obj -> kompilierte Sourcedatei (Binaries).
    lib -> mehrere obj-Dateien in einer (halt Bibliothek).

    Wie gesagt: der Linker meckert, weil er keine Binaries hat. Die Header reicht nicht.



  • okay danke, habs jetzt geschnallt 😉
    kann mir jemand sagen wie ich die sources mit dem msvs per kommandozeile ins .o format bringe, sodass ich die binaries nach einer änderung immer einzeln per script ändern kann?



  • also muss ich die objektdatei aber trotzdem extra mit angeben? warum findet er die nicht automatisch wenns als binary existiert? dann könnte ich doch einfach im header der eingebunden wird noch schreiben #include <source_for_this_header.cpp> und das problem wäre behoben.



  • I) Ich habe bei einem MS-Compiler noch nie ein .o gesehen, bei mir hießen die immer .obj

    II) Im Header die zugehörige Source-Datei anzugeben ist wenig sinnvoll: Wie Bjarne Stroustrup in seinem Buch "The C++ Programming Language" darstellt muss der Header der zum Verwenden eines Komponente eingebunden wird nicht zwingendermaßen der Header sein, der in der Source inkludiert wird, so kann man z.B. private Funktionen aus dem öffentlichen Header streichen. Die Implementierung der im Header deklarierten funktionen muss auch nicht zwingendermaßen in einer Source / Objektdatei stattfinden.

    Daher: Trage deine .obj genau so ein wie du das mit Biblioteksdateien machen würdest: Header in der Source inkludieren und obj dem Linker mitgeben


Log in to reply