"Multiple definition of 'Name'" mit g++.exe



  • Hallo,

    ich kompiliere ein Projekt mit Dev-Cpp/GCC.
    make.exe führt auch erfolgreich aus, aber das Übergeben der Object-Dateien an g++.exe führt zu einer endlosen Liste an Fehlern nach folgendem Muster:

    huffman.o(.text+0x0):huffman.cpp: multiple definition of `Push(Node*)'
    main.o(.text+0x0):main.cpp: first defined here
    

    für jede Prozedur in "huffman.cpp" kommt eine solche Meldung. "main.cpp" ist die Hauptdatei:

    #include <iostream>
    #include <stdlib.h>
    
    #include "huffman.cpp"
    
    int main(int argc, char *argv[])
    {
        char Message[] = "ABRACADABRASIMSALABIM";
    
        CreateHuffmanTree(Message, sizeof Message / sizeof(char));
        std::cout << Serialize() << std::endl;
    
        Erase();
    
        system("PAUSE");
        return 0;
    }
    

    "huffman.cpp" enthält jede Menge Funktionen, keine Includes. Nix besonderes.

    Wieso wird überhaupt eine "huffman.o" erstellt? Ich dachte, die Präprozesoranweisung #include würde den Code inlinen (die beiden Dateien befinden sich in einem Dev-Cpp-Projekt)?



  • Wieso wird überhaupt eine "huffman.o" erstellt? Ich dachte, die Präprozesoranweisung #include würde den Code inlinen (die beiden Dateien befinden sich in einem Dev-Cpp-Projekt)?

    Die huffman.o wird erstellt, gerade *weil* sich die huffman.cpp mit im Projekt befindet. Dadurch kommt es dann zu doppelten Definitionen, weil die in huffman.cpp definierten Symbole sowohl in main.o als auch in huffman.o liegen.

    Normalerweise bindet man cpp-Dateien auch nicht per #include ein.



  • Bashar schrieb:

    Normalerweise bindet man cpp-Dateien auch nicht per #include ein.

    Wenn ich kein #include verwende, bekomme ich -- wie erwartet -- den Fehler "'CreateHuffmanTree' undeclared."



  • Normalerweise schreibt man eine passende Headerdatei, die die entsprechenden Deklarationen enthält, und bindet diese dort ein, wo man sie braucht.



  • ääh, ja. Stimmt, klappt, danke.


Anmelden zum Antworten