Linker-Fehler
-
Hallo!
Ich hab' folgendes Problem:
Mein C-Programm besteht aus 4 Modulen (eine .c-Datei und drei .h-Dateien). Das Kompilieren und Linken läuft unter MS Visual C++ problemlos ab. Wenn ich aber den gleichen Quellcode mit dem "Programmers Notepad (WINAVR)" kompiliere, kommt beim Linken zur folgenden Fehlermeldung:
"multiple definition of ..." und zwar für jede Funktion, die ich in meinem Programm hab', auch für main().
Kann mir jemand helfen?
vielen Dank im voraus
-
Sehr hilfreich, den Code nicht zu posten
Versuchs mal mit Include Guards in den Headern
#ifndef HEADERNAME_H #define HEADERNAME_H // code #endif
-
Kann es seien, dass du innerhalb der .h-Dateien Funktionen beschreibst? (Also nicht nur Klassen etc.) Das ist nicht erlaubt, diese Definitionen müssen in .cpp-Dateien (.cc-Dateien
). Hatte ich auchmal das Problem.
EDIT: Ich seh gerade, wir sind im C Forum, also Klassen wohl weniger ;-).
-
Danke, es funktioniert jetzt!
Du hattest recht, ich hab' irgendwann auch davon gehört, mich hat's nur irritiert, dass es unter MS VS lief
.
-
Kann es seien, dass du innerhalb der .h-Dateien Funktionen beschreibst? (Also nicht nur Klassen etc.) Das ist nicht erlaubt, diese Definitionen müssen in .cpp-Dateien (.cc-Dateien
). Hatte ich auchmal das Problem.
Das ist falsch, man kann in der Header Datei implementieren soviel man will, das ist nur nicht besonders gut, aber es fuktioniert!
-
GPC schrieb:
Das ist falsch, man kann in der Header Datei implementieren soviel man will, das ist nur nicht besonders gut, aber es fuktioniert!
Seh das auch so. Dem Compiler ist's egal der weiss sowieso nicht was ein Header ist und ob das File das er gerade compiliert jetzt .h oder .cc heisst erfährt er nicht mal ( nur der Präprozessor ).
Kurt
-
Wenn das so egal ist, dann erklär mir doch mal einer den Fehler!
-
Der Compiler baut aus jedem CPP-File (nachdem alle #include aufgelöst wurden) ein Objekt-File (.LIB) - dort steht unter anderem der Maschinencode aller definierten Funktionen drin. Der Linker nimmt alle LIB's und baut sie zu einer einzigen EXE zusammen, dabei sucht er zu jeder Verwendung einer Funktion den zugehörigen Maschinencode heraus. Wenn nun die selbe Funktion in zwei Dateien definiert wurde, steht er vor einem mittelschweren Problem, weil er nicht entscheiden kann, welche dieser Versionen die 'richtige' ist - also meldet er einen Fehler.
-
Das passiert aber nicht, wenn man den "üblichen Rahmen" #ifndef ... bildet, weil da gibt's dann doch nix zu entscheiden.
-
Evolver schrieb:
Das passiert aber nicht, wenn man den "üblichen Rahmen" #ifndef ... bildet, weil da gibt's dann doch nix zu entscheiden.
Doch - dieses #ifndef-Konstrukt schützt nur davor, daß du den Header doppelt in der selben Übersetzungseinheit einbindest - der Linker sieht davon gar nichts.
-
es sind keine LIBs sondern .Os