Mindestens ein mehrfach definiertes Symbol
-
Hallo,
ich weiss, das ist ein Standartfehler.
Ich habe auch schon das ganze Forum mit Google durchsucht. Habe alles, was gesagt wurde ausprobiert, nichts ändert sich.
Ich arbeite mit Visual Studio 10 EE.Ich habe 4 Dateien:
main.h
#ifndef MAIN_H #define MAIN_H #include "blendelf.h" #include <Windows.h> #include "framework.h" #endifmain.cpp
#include "main.h" int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { if(FAILED(sys_init())) { MessageBox(NULL, L"Framework konnte nicht initialisiert werden.", L"Error: Framework", MB_OK); return 0; } while(elfRun()) { if(FAILED(sys_update())) { MessageBox(NULL, L"Framework konnte nicht geupdatet werden.", L"Error: Framework", MB_OK); return 0; } } return 0; }framework.h
#ifndef FRAMEWORK_H #define FRAMEWORK_H #include <Windows.h> #include <stdlib.h> #include <stdio.h> #include "blendelf.h" HRESULT sys_init(); HRESULT sys_update(); char char_frm_fps[255]; int int_frm_fps; elf_handle eh_gui_frm_gui; elf_handle eh_font_frm_1; elf_handle eh_lab_frm_fps; #endifframework.cpp
#include "framework.h" ///////////////////////////////////////////////////////////////////////////////////////// //Initializes the framework. // //PARAMETERS: No parameters. //RETURNS: HRESULT, if the function succeeded. ///////////////////////////////////////////////////////////////////////////////////////// HRESULT sys_init() { if(!elfInitWithConfig("config.txt")) return E_FAIL; eh_gui_frm_gui=elfCreateGui(); elfSetGui(eh_gui_frm_gui); eh_font_frm_1=elfCreateFontFromFile("impact.ttf", 12); eh_lab_frm_fps=elfCreateLabel("eh_lab_frm_fps"); elfSetLabelFont(eh_lab_frm_fps, eh_font_frm_1); elfSetLabelText(eh_lab_frm_fps, "FPS: 0"); elfSetGuiObjectPosition(eh_lab_frm_fps, 10, 10); elfAddGuiObject(eh_gui_frm_gui, eh_lab_frm_fps); elfHideMouse(true); return S_OK; } ///////////////////////////////////////////////////////////////////////////////////////// //Updates the framework. // //PARAMETERS: No parameters. //RETURNS: HRESULT, if the function succeeded. ///////////////////////////////////////////////////////////////////////////////////////// HRESULT sys_update() { int_frm_fps=elfGetFps(); sprintf(char_frm_fps,"FPS: %d",int_frm_fps); elfSetLabelText(eh_lab_frm_fps,char_frm_fps); return S_OK; }Und ich bekomme diese errors:
1>------ Erstellen gestartet: Projekt: BlendELF, Konfiguration: Debug Win32 ------
1> main.cpp
1>c:\projects\blendelf\blendelf\blendelf.h(263): warning C4522: 'elf_handle': Mehrere Zuweisungsoperatoren angegeben
1>main.obj : error LNK2005: "int int_frm_fps" (?int_frm_fps@@3HA) ist bereits in framework.obj definiert.
1>main.obj : error LNK2005: "char * char_frm_fps" (?char_frm_fps@@3PADA) ist bereits in framework.obj definiert.
1>main.obj : error LNK2005: "class elf_handle eh_font_frm_1" (?eh_font_frm_1@@3Velf_handle@@A) ist bereits in framework.obj definiert.
1>main.obj : error LNK2005: "class elf_handle eh_gui_frm_gui" (?eh_gui_frm_gui@@3Velf_handle@@A) ist bereits in framework.obj definiert.
1>main.obj : error LNK2005: "class elf_handle eh_lab_frm_fps" (?eh_lab_frm_fps@@3Velf_handle@@A) ist bereits in framework.obj definiert.
1>C:\Projects\BlendELF\Debug\BlendELF.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
Der Fehler liegt in dem File "framework.h"
Schau da mal ganz genau, ob du da nicht etwas definierst! Du hast da exakt 5 Definitionen drin. Der Compiler sagt dir sogar welche das sind.

-
Ja, ich weiss, welche. Nur warum darf man denn keine globalen Variablen in dem Header definieren?
-
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 dann1>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.