Mindestens ein mehrfach definiertes Symbol



  • Weil es dann mehrere Definitionen des gleichen Objektes in verschiedenen Quelldateien gibt und welche soll dann benutzt werden?
    Oder um ein Stichwort für google zu geben: ODR (one definition rule).



  • Jedes Objekt wird doch nur einmal in der framework.h definiert. Oder seh ich da was falsch?
    In der framework.c werden die Objekte/Variablen doch nur angewandt, nicht definiert.



  • Es wird nur in einer Datei definiert ja, aber die Datei wird in mehreren Quelldateien inkludiert.
    framework.cpp -> framework.h
    main.cpp -> main.h -> framework.h



  • Aah, okay, das klappt schonmal. Nur wenn ich jetzt aus der main.h das
    #include "framework.h" rausnehme kommt, O Wunder, dass er die Funktionen
    "sys_init" und "sys_update" nicht kennt. Müsste ich also Prototypen definieren, oder gibt es da einen anderen Weg.



  • Razoron schrieb:

    Nur wenn ich jetzt aus der main.h das
    #include "framework.h" rausnehme kommt, O Wunder, dass er die Funktionen
    "sys_init" und "sys_update" nicht kennt.

    Das ist ja auch der falsche Ansatz. Du musst die Definition dieser Variablen aus dem Header herausnehmen. Man definiert keine Variablen in Headern. Stichwort extern.



  • Also doch auch wieder aus der main.h framework.h inkludieren und dann die Variablen in die framework.cpp packen?



  • Razoron schrieb:

    Also doch auch wieder aus der main.h framework.h inkludieren und dann die Variablen in die framework.cpp packen?

    Jein. Du musst, damit du von wo andesrst Zugriff auf die Variable haben willst den Namen bekannt machen und das geschieht durch das Schlüsselwort extern . Damit kannst du eine Variablendeklaration in einen Header bringen. (Das ist dann so etwas, wie eine Funktionsdeklaration).



  • Also müsste es in der framework.h

    extern char char_frm_fps[255];
    
    extern int int_frm_fps;
    
    extern elf_handle eh_gui_frm_gui;
    extern elf_handle eh_font_frm_1;
    extern elf_handle eh_lab_frm_fps;
    

    heissen.
    Ich dachte "extern" zeigt dann, wenn es schon einmal aufgelöst wurde, auf die bereits deklarierte Variable.
    Ich bekomme dann

    1>framework.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class elf_handle eh_lab_frm_fps" (?eh_lab_frm_fps@@3Velf_handle@@A)".
    1>framework.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class elf_handle eh_font_frm_1" (?eh_font_frm_1@@3Velf_handle@@A)".
    1>framework.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class elf_handle eh_gui_frm_gui" (?eh_gui_frm_gui@@3Velf_handle@@A)".
    1>framework.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""char * char_frm_fps" (?char_frm_fps@@3PADA)".
    1>framework.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""int int_frm_fps" (?int_frm_fps@@3HA)".
    


  • Da fehlen noch die Definitionen in der cpp.
    Das extern sagt dem Compiler nur, dass es diese Variablen gibt. Definieren musst du sie schon noch.



  • Aj, okay, danke an euch alle, habe zum ersten mal mit Headern richtig gearbeitet.


Anmelden zum Antworten