Linkfehler 2005 und 1169
-
Ich hab ein kleines Problem mit der Erzeugung eines Wstring arrays.
Das Problem ist, das Array muss Global sein, aber wenn ich kompiliere bekomme ich die Linkfehler 2005 und 1169.main.cpp
#include "File.hpp" #include "Global.hpp" int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int iCmdShow) { /**/ LoadLanguage(); /**/ return 0; }
File.hpp
#ifndef FILE_HPP #define FILE_HPP #include <string> #include <Windows.h> #include "Global.hpp" void LoadLanguage(); #endif
Global.hpp
#ifndef GLOBAL_HPP #define GLOBAL_HPP const int MAXMSG=10; std::wstring Message[MAXMSG]; #endif
(in der File.cpp wird das array nur mit wstring gefüllt)
und als output bekomme ich:
1>------ Erstellen gestartet: Projekt: Test, Konfiguration: Release Win32 ------ 1> File.cpp 1> Winmain.cpp 1>Winmain.obj : error LNK2005: "class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > * Message" (?Message@@3PAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@A) ist bereits in File.obj definiert. 1>C:\Users\user\Desktop\Win Test\Test\Release\Test.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden. ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
danke schon mal im voraus
-
Du darfst die Variable im Header nur extern deklarieren. In einem cpp musst du sie dann definieren.
Das sie global sein muss bezweifle ich allerdings.
-
warum extern?
(Kenne mich nicht damit aus,aber die mehrfach Difinition sollte doch eigentlich durch die include Guards geregelt werden...)Das sie global sein muss bezweifle ich allerdings.
Ich brauche das array in der Window Prozedur,außerdem muss ich das array dann nicht immer als parameter mit geben
-
ok jetzt steh ich richtig aufm Schlauch...
hab den code in#ifndef GLOBAL_HPP #define GLOBAL_HPP const int MAXMSG=10; extern std::wstring Message[MAXMSG]; #endif
umgeändert und bekomme diese Fehlermeldung
1>------ Erstellen gestartet: Projekt: Test, Konfiguration: Release Win32 ------ 1> File.cpp 1> Winmain.cpp 1>File.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > * Message" (?Message@@3PAV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@A)". 1>C:\Users\user\Desktop\Win Test\Test\Release\Test.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise. ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
-
Stichwort: One Definition Rule
Include-Guards helfen nur bei Mehrfachverwendung innerhalb einer Übersetzungseinheit (ÜE), nicht bei mehreren zu compilierenden ÜE. Eine Variable darf aber nur genau 1x definiert sein.
Edit: du mußt diese globale Variable in einer ÜE definieren (z.B. in der main.cpp). Ist quasi doppelte Schreibarbeit, aber anders geht es so nicht. Generell sind aber globale Variablen verpöhnt, da man bei größeren Projekten den Überblick verliert, wer diese Variablen ändert.
-
OK danke klappt endlich