Linker beschwert sich. Ich weiß nicht mehr weiter: LNK2005



  • Hallo liebe Community,

    über die Uni bin ich zum Programmieren gekommen. Ewig lang haben wir die Grundlagen (Klassen, Funktionen, Variablen, Datentypen, man kennt das) durchgearbeitet. Nun schreibe ich mein erstes eigenes größeres Programm und das lief bisher recht gut! 🙂

    Auf Grund des zunehmenden Umfangs möchte ich mein Programm modularisieren. Der Gedanke: einzelne Operationen werden in separaten .cpp und .h Bereichen gemacht und in einer Client-Datei (frei nach Jürgen Wolf) ausgeführt. Dabei tritt folgendes Problem auf:

    Fehler	LNK2005	"void __cdecl DateienLeser::Speichern(void)" (?Speichern@DateienLeser@@YAXXZ) ist bereits in Lesen.obj definiert.	Fraese_Operator	C:\Users\Admin\Documents\VS\Fraese_Operator\Fraese_Operator\Rechnen.obj	1
    

    und einmal auch:

    Fehler	LNK1169	Mindestens ein mehrfach definiertes Symbol gefunden.	Fraese_Operator	C:\Users\Admin\Documents\VS\Fraese_Operator\Debug\Fraese_Operator.exe	1
    

    Um das Ganze mit Leben zu füllen:
    In Lesen.obj wird eine .txt-Datei eingelesen. Wichtige Werte werden in das gewünschte Format gebracht und in ein Deque gespeichert - funktiert tip-top! Auf diese, hier eingelesenen Werte, möchte ich nun in Rechnen.obj zugreifen und - wie soll es anders sein - Rechenoperationen durchführen. Dafür habe ich die Lesen.h in die Rechnen.h inkludieren wollen. Doch jetzt beschwert sich, wie oben, der Linker.

    Was ich bisher gemacht habe: Ich benutze Namensräume, habe in die Header die Präprozessordirektiven Ifndefine, Define und schließlich endif aufgenommen. Habe mir den Linker angeguckt und nach Beiträgen aus englisch-sprachigen Foren zusätzliche Abhängigkeiten auf "additionaldependencies" gestellt. Hilft alles nichts.

    Folgendes steht übrigens in meinem Linker:

    kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)
    

    Lange Rede, kurzer Sinn: Wo hakt es? Wie kann ich die doppelte definition verhindern? Muss der Linker anders eingestellt werden? Wenn ja, wie? Ich bin für jede Hilfe dankbar, hoffe, ich bin im richtigen Forenabschnitt und freue mich auf eure Antwort 🙂

    Vielen Dank,
    JM



  • @johnmoe sagte in Linker beschwert sich. Ich weiß nicht mehr weiter: LNK2005:

    frei nach Jürgen Wolf

    Das kann ja nicht gut gehen.

    Was hat die Frage mit MFC zu tun?

    Ohne Code keine Hilfe. Wie und wo ist die Funktion definiert?



  • Also das Problem ist eingentlich ganz simpel: Das Symbol Speichern@DateienLeser@@YAXXZ) ist bereits in Lesen.obj definiert. Du solltest also einfach das Symbol Speichern@DateienLeser@@YAXXZ) nicht bereits in Lesen.obj definieren.



  • Ich nehme an du wirst DateienLeser::Speichern in einem Header-File definiert haben, aber ausserhalb der Klasse und ohne inline davorzuschreiben.
    Falls das stimmt ändere einfach eines dieser Dinge und der Fehler sollte verschwinden.

    Grund/Erklärung:

    • Definitionen die nicht inline sind dürfen im Programm nur 1x auftauchen - das nennt man ODR (One Definition Rule)
    • Wenn du das selbe Header File in mehreren .cpp Files einbindest gilt das als "mehrfach auftauchen"
    • Funktionsdefinitionen innerhalb der Klassendefinition sind automatisch inline


  • Hallo liebe Leute!

    Vielen Dank für eure Antworten! Letztendlich war es, was @TGGC gesagt hat. Ich war unsauber in der Trennung von Definition und Deklaration. Das Problem besteht jedoch immer noch. Ich kann nicht auf ein Deque, in dem ich Objekte speichere, .cpp-übergreifend zugreifen.

    Ich habe einmal nachgeschlagen, was du meintest @hustbaer und ich bin mir nicht sicher, ob es wirklich mit den Funktionen zusammenhängt. Hatte da gestern einiges probiert und meine Version etwas aktualisiert. Nun habe ich einen neuen Post an anderer Stelle verfasst (da ich, auf Grund meiner geringen Fachsprachenkenntnisse wirklich keine Ahnung habe, wo was wie hingehört @manni66) :

    Vielleicht kann der ein oder andere von euch auch dazu was sagen. Ich habe auch etwas Code dazugeschrieben: https://www.c-plusplus.net/forum/topic/347812/modularisierung-zugriff-auf-ein-objekte-in-verschiedenen-cpp

    Nochmals vielen Dank!



  • @johnmoe sagte in Linker beschwert sich. Ich weiß nicht mehr weiter: LNK2005:

    Ich kann nicht auf ein Deque, in dem ich Objekte speichere, .cpp-übergreifend zugreifen.

    Doch das kannst du. Ohne Probleme. Du kannst aber nicht 2 unterschiedliche deque mit dem gleichen Namen haben, die gleichzeitig sichtbar sind.