Linker Error
-
Guten Tag,
ich habe die beiden Dateien:
class.cpp - http://nopaste.info/0826ba0d11.html
main.cpp - http://nopaste.info/d451af80a0.html
in Visual C++ 2008Dieser Fehlercode:
1>------ Erstellen gestartet: Projekt: SMTPd, Konfiguration: Debug Win32 ------ 1>Kompilieren... 1>class.cpp 1>main.cpp 1>Code wird generiert... 1>Verknüpfen... 1>main.obj : error LNK2005: "public: __thiscall smtpd::smtpd(char * const,int)" (??0smtpd@@QAE@QADH@Z) ist bereits in class.obj definiert. 1>main.obj : error LNK2005: "public: int __thiscall smtpd::initialisieren(void)" (?initialisieren@smtpd@@QAEHXZ) ist bereits in class.obj definiert. 1>main.obj : error LNK2005: "public: void __thiscall smtpd::beenden(void)" (?beenden@smtpd@@QAEXXZ) ist bereits in class.obj definiert. 1>main.obj : error LNK2005: "public: void __thiscall smtpd::neustart(void)" (?neustart@smtpd@@QAEXXZ) ist bereits in class.obj definiert. 1>C:\Users\Jonas\Documents\Visual Studio 2008\Projects\SMTPd\Debug\SMTPd.exe : fatal error LNK1169: Mindestens ein mehrfach definiertes Symbol gefunden. 1>Das Buildprotokoll wurde unter "file://c:\Users\Jonas\Documents\Visual Studio 2008\Projects\SMTPd\SMTPd\Debug\BuildLog.htm" gespeichert. 1>SMTPd - 5 Fehler, 0 Warnung(en) ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
So wie ich das sehe kompiliert er es. Demnach kein Fehler im Code. Offensichtlich denkt der Linker, dass die Klasse zwei mal definiert ist.
Was ist da los?
MfG
-
Du hast die Funktionen für class smtpd in class.cpp definiert und includest class.cpp in main.cpp. Damit sind die Funktionen zweimal definiert und er ist verwirrt.
Um das aufzulösen trennt man Deklaration und Definition, schreibt die Definition in die .cpp-Dateien und die Deklaration in die .h-Dateien und includet nur die .h-Dateien.Ansonsten versuchs mal mit #pragma once, ich mags nicht, aber es könnte für dich funktionieren.
-
nwp2 schrieb:
Du hast die Funktionen für class smtpd in class.cpp definiert und includest class.cpp in main.cpp. Damit sind die Funktionen zweimal definiert und er ist verwirrt.
Um das aufzulösen trennt man Deklaration und Definition, schreibt die Definition in die .cpp-Dateien und die Deklaration in die .h-Dateien und includet nur die .h-Dateien.Ansonsten versuchs mal mit #pragma once, ich mags nicht, aber es könnte für dich funktionieren.
cpp-Dateien sollte man nie inkludieren, auch nicht mit #pragma once. Das ist ein netter Ersatz für include guards (wenn man die defines nicht noch woanders braucht), aber kein Freibrief für schlechten Stil.
Außerdem dürfte das doch auch nicht funktionieren. Eine dem Projekt zugehörige cpp-Datei ist eine Übersetzungseinheit und wird an den Compiler verfüttert. Somit kriegt der Linker am Ende doch seine doppelten Definitionen...
-
Nach Auftrennung der class.cpp in class.h und class.cpp läuft alles. In main.cpp ist nun class.h inkludiert.
Danke