LNK1169 Mindestens ein mehrfach definiertes Symbol gefunden.



  • Ich hätte gerne eine kurze Erklärung wieso das passiert und was ich dagegen machen kann.
    Hier ist der Code den ich benutze (es geht mir hier um das prinzip eine Funktion aus einer anderen Datei zu nutzen).

    #include <iostream>
    #include "funtion.cpp"
    
    
    int main(void) {
    	hello_world();
    }
    
    #include <iostream>
    
    int hello_world();
    
    int hello_world() {
    	std::cout << "hello world";
    	return 0;
    }
    


  • üblicherweise trennt man in C++ Header- und Implementationsdateien (.h und .cpp Dateien). In der Headerdatei werden Funktionen deklariert, in der cpp-Datei implementiert. Das sieht dann so aus:

    .h Datei

    #pragma once // Anweisung an den Compiler, den Inhalt der Datei pro Übersetzungseinheit nur ein Mal auszuwerten
    
    int hello_world(); // Deklaration der Funktion hello_world
    

    .cpp Datei

    #include "funktion.h"  // .h Datei inkludieren, nicht die .cpp Datei
    #include <iostream>
    
    // Implementation der hello_world()-Funktion
    int hello_world()
    {
       std::cout << "Hello World";
       return 0;
    }
    

    Dem Compiler reicht es zu wissen, dass es irgendwo eine Funktion hello_world() gibt, was sie genau macht spielt erstmal keine Rolle. Dazu reicht die .h Datei aus, weil sie dem Compiler sagt, dass es diese Funktion mit der Signatur irgendwo gibt. Wenn der Compiler die .cpp Datei übersetzt erzeugt er eine Objekt-Datei, die den Programmcode der Funktion enthält. Der Linker sucht sich dann die benötigten Objektdateien zusammen und benutzt den echten Programmcode, um die Funktionsaufrufe mit Leben zu füllen.

    Man kann auch cpp Dateien inkludieren, das ist aber eher ungewöhnlich und man braucht schon einen triftigen Grund dafür.

    Edit:
    Wie Th69 schon sagte, wird die Datei funktion.cpp zwei mal übersetzt: Ein mal, weil sie Bestandteil deines Projekts ist und ein zweites Mal, weil du sie per #include "funktion.cpp" noch mal einbindest.



  • Die Linker-Fehlermeldung scheint daher zu kommen, daß du auch noch separat die "funtion.cpp" zusammen mit der "main.cpp" kompilierst und linkst - und dann hast du dort zweimal die Funktion hello_world() kompiliert.
    Informiere dich mal über die One-Definition-Rule (ODR).


Log in to reply