Eine Variable, mehrere Dateien, die diese verwenden -> Problem°!°



  • Hoi alle zusammen,

    Also ich habe in einer Datei (header.h) einige Variablen definiert, welche in anderen Cpp-Dateien gebraucht werden. Dazu habe ich in jeder Cpp-Datei diesen Header inkludiert... Das Problem ist, das mein Compiler beim Compilieren mir folgendes anzeigt:

    Microsoft Visual C++ 6.0 schrieb:

    --------------------Konfiguration: CrossXChat - Win32 Release--------------------
    Kompilierung läuft...
    LangDlgProc.cpp
    Main.cpp
    Linker-Vorgang läuft...
    Main.obj : error LNK2005: "struct HWND__ * g_hwndMain" (?g_hwndMain@@3PAUHWND__@@A) bereits in LangDlgProc.obj definiert
    Main.obj : error LNK2005: "struct HINSTANCE__ * g_hInst" (?g_hInst@@3PAUHINSTANCE__@@A) bereits in LangDlgProc.obj definiert
    Main.obj : error LNK2005: "struct HINSTANCE__ * g_hmDllLanguage" (?g_hmDllLanguage@@3PAUHINSTANCE__@@A) bereits in LangDlgProc.obj definiert
    Main.obj : warning LNK4006: "struct HWND__ * g_hwndMain" (?g_hwndMain@@3PAUHWND__@@A) bereits in LangDlgProc.obj definiert; zweite Definition wird ignoriert
    Main.obj : warning LNK4006: "struct HINSTANCE__ * g_hInst" (?g_hInst@@3PAUHINSTANCE__@@A) bereits in LangDlgProc.obj definiert; zweite Definition wird ignoriert
    Main.obj : warning LNK4006: "struct HINSTANCE__ * g_hmDllLanguage" (?g_hmDllLanguage@@3PAUHINSTANCE__@@A) bereits in LangDlgProc.obj definiert; zweite Definition wird ignoriert
    Bibliothek Release/CrossXChat.lib und Objekt Release/CrossXChat.exp wird erstellt
    Release/CrossXChat.exe : fatal error LNK1169: Ein oder mehrere mehrfach definierte Symbole gefunden
    Fehler beim Ausführen von link.exe.

    CrossXChat.exe - 4 Fehler, 3 Warnung(en)

    Das ja heißen müsste, das das 'zu oft definiert bzw inkludiert wurde...wie kann ich das jetzt lösen/umgehen ?

    PS_1: so sieht mein Header aus:
    GlobalAfx.h

    #ifndef _GLOBAL_AFX_H_
    #define _GLOBAL_AFX_H_
    
    /* ======================= System Module Dependencies ========================== */
    
    #include <Windows.h>
    
    /* ============================= Global Variables ============================== */
    
    HMODULE		g_hmDllLanguage;
    HINSTANCE	g_hInst;
    HWND		g_hwndMain;
    
    #endif /* _GLOBAL_AFX_H_ */
    

    PS_2: ist zwar WinAPI, aber die Frage bezieht sich auf C++ 😉

    VIELEN DANK schonmal!



  • Hallo

    Mit dem Schlüsselwort extern

    #ifndef _GLOBAL_AFX_H_
    #define _GLOBAL_AFX_H_
    
    /* ======================= System Module Dependencies ========================== */
    
    #include <Windows.h>
    
    /* ============================= Global Variables ============================== */
    
    /// Definition
    extern HMODULE        g_hmDllLanguage;
    extern HINSTANCE    g_hInst;
    extern HWND        g_hwndMain;
    
    #endif /* _GLOBAL_AFX_H_ */
    

    und in der dazugehörenden CPP-Datei

    ...
    /// Deklaration und Initialisierung
    HMODULE        g_hmDllLanguage;
    HINSTANCE    g_hInst;
    HWND        g_hwndMain;
    

    bis bald
    akari



  • jau, vielen dank, perfekt!



  • Hallo,

    Ich würd dir noch empfehlen, das nicht inner Header zu machen...
    Das kann schnell zu Fehlern führen...
    Lieber so:

    Main.cpp

    int   iSample;
    char  szBuffer;
    long  lNumber;
    // initialisieren und verwenden
    // ...
    

    Demo.cpp

    extern int   iSample;
    extern char  szBuffer;
    extern long  lNumber;
    // verwenden
    // ...
    

    ...nur so als kleiner Nachtrag 😉



  • Woher hast Du denn das bitte?

    Die Variablen extern in einem Header zu deklarieren und in einem Codefile einmal zu definieren ist der einzig gangbare Weg um Fehler zu vermeiden, Deine Methode ist weit fehlerträchtiger.



  • hmm also bei mir hats die Kombination gemacht...ich hab extern jetzt verwendet, aber -wie CodeFinder gesagt hat- ohne Header, denn mit hats nicht funktioniert (gleiche Compiler-Fehler)...und so funktioniert das prächtig!
    Also Dank sowohl an akari und CodeFinder ➡ 👍

    @LordJaxom:
    Zu welchen Fehlern kann denn das deiner Meinung nach führen...hast du vllt. n Beispiel ?

    und danke nochmal an alle 😉

    cya



  • Ganz einfach:
    Normalerweise definiere ich die Variablen in einer Übersetzungseinheit und packe gleich die Extern-Deklaration in den Header. Wenn ich jetzt an einer dieser Stellen den Datentyp ändere und an der anderen nicht, gibt es einen Fehler in eben jener ÜE.

    Wenn ich in jedes Codefile die Extern-Deklaration packe, und dann den Datentyp einer dieser Variablen ändern will,
    a) muss ich das an mehr als zwei Stellen tun (nämlich in JEDEM Codefile wo dies verwendet wird)
    b) wird mich der Compiler nicht warnen wenn ich eine Stelle vergesse.

    Davon ab, ist Code per Copy&Paste von einem Codefile ins andere zu befördern sehr sehr unschön 😉



  • Hi LordJaxom...

    Also das hab ich ja versucht...:

    Ganz einfach:
    Normalerweise definiere ich die Variablen in einer Übersetzungseinheit und packe gleich die Extern-Deklaration in den Header. Wenn ich jetzt an einer dieser Stellen den Datentyp ändere und an der anderen nicht, gibt es einen Fehler in eben jener ÜE.

    Aber es hat die gleichen Fehler verursacht, wie ich oben schon gepostet hab...
    Kannst du mir vllt. n kleinen Beispielcode schreiben der das demonstriert...wär echt nett!

    thx schonmal! 👍



  • Naja wenn Du Dich nicht vertippt hast ist es genau akaris Beispiel:

    Im Header

    #ifndef _GLOBAL_AFX_H_
    #define _GLOBAL_AFX_H_
    
    /* ======================= System Module Dependencies ========================== */
    
    #include <Windows.h>
    
    /* ============================= Global Variables ============================== */
    
    /// Definition
    extern HMODULE        g_hmDllLanguage;
    extern HINSTANCE    g_hInst;
    extern HWND        g_hwndMain;
    
    #endif /* _GLOBAL_AFX_H_ */
    

    Und in einem (beliebigen, falls es keine global_afx.cpp gibt) .cpp-File

    HMODULE g_hmDllLanguage;
    HINSTANCE g_hInst;
    HWND g_hwndMain;
    


  • Aber ich muss doch
    Erst die Header inkludieren, um dann die Vars definieren oder ?

    // ...
    #include "GlobalAfx.h"
    // ...
    HMODULE    g_hmDllLanguage;
    HINSTANCE  g_hInst;
    HWND       g_hwndMain;
    // ...
    

    so, oder ? ...
    das hab ich gemacht, das hat aber nicht funktioniert...und die Compilermeldungen, haben nicht auf einen Tippfehler hingeweisen ( ➡ Bei einem: "Ein oder mehrere mehrfach definierte Symbole gefunden" ...ist ja keine Tippfehler, sondern was generelles zu 'vermuten' oder ?)



  • Du solltest erst den Header inkludieren, um o.a. Problem aus dem Weg zu gehen. Ansonsten kann es höchstens sein dass nicht alles neucompiliert wurde. Wenn die Dinger nur in einer cpp-Datei ohne extern stehen, gibt es keine multiple symbols mehr.



  • LordJaxom schrieb:

    Woher hast Du denn das bitte?

    ...
    Jo, das war prinzipiell nur n Zitat aus nem anderen Forum, habs mal ausprobiert (hätte ich vllt. mal vorher machen solln^^ -sry-) und LordJaxom hat Recht...

    es ist besser das inner Header zu machen...ALSO nochmal resümieren:

    Header.h:

    #ifndef _HEADER_H_
    #define _HEADER_H_
    
    extern int   iSample;
    extern long  lSample;
    extern char  szBuffer[100];
    
    #endif /* _HEADER_H_ */
    

    Main.cpp:

    #include <iostream>
    #include "Header.h"
    
    int   iSample;
    long  lSample;
    char  szBuffer[100];
    
    int main()
    {
        // externe, globale Variablen initialisieren/verwenden:
        // ...
        // Beispiel:
        iSample = 23;
        lSample = 789;
        strcpy(szBuffer, "Hallo");
        return (0);
    }
    

    in weiteren möglichen Dateien:
    z.B.:

    Demo.cpp:

    #include <iostream>
    #include "Header.h"
    // hier verwenden...
    // ...
    // Beispiel:
    iSample = 45;
    lSample = 899;
    strcpy(szBuffer, "Welt!");
    

    so...hoffe das war korrekt 😉

    PS: Hab den Code NICHT getestet, aber er sollte ja nur das Prinzip demonstrieren!


Anmelden zum Antworten