Hi,
ich beschäftige mich im Moment ein wenig mit der Aufteilung von C++ Projekten in mehrere Files und bin dabei auf ein Verständnisproblem gestoßen.
Angenommen ich habe eine main.cpp mit meinem Hauptprogramm und zusätzlich my.h und my.cpp womit ich mir einige Klassen und Funktionen zur Verfügung stelle.
In main.cpp und my.cpp kommt natürlich ein
#include "my.h"
Definiere ich jetzt in my.h eine globale Variable, so erhalte ich bei generieren einer .exe einen Linkerfehler wegen mehrfacher Definition. Das liegt natürlich daran, dass über das #include dieselbe Variable sowohl in der my.cpp als auch main.cpp definiert werden (und somit Speicher reserviert wird).
Was ich nicht verstehe ist, warum der Linker sich um so etwas kümmert? Nach allen Beschreibungen die ich so finden konnte verknüpft er doch bloß Objektdateien die den vom Compiler erstellten Maschinencode enthalten, und der Maschinencode ist natürlich frei von irgendwelchen Variablenbezeichnern und enthält bloß noch Adressen, also woran erkennt der Linker noch dass irgend eine Variable doppelt definiert war?
PS: Ich hab schon die Vermutung, dass die Frage zu sehr ins Detail geht und man sich sehr genau mit der Funktionsweise von Compiler und Linker beschäftigen muss um das nachzuvollziehen, aber vll kann ja trotzdem wer ne einfache Erklärung liefern.
ich beschäftige mich im Moment ein wenig mit der Aufteilung von C++ Projekten in mehrere Files und bin dabei auf ein Verständnisproblem gestoßen.
Angenommen ich habe eine main.cpp mit meinem Hauptprogramm und zusätzlich my.h und my.cpp womit ich mir einige Klassen und Funktionen zur Verfügung stelle.
In main.cpp und my.cpp kommt natürlich ein
#include "my.h"
Definiere ich jetzt in my.h eine globale Variable, so erhalte ich bei generieren einer .exe einen Linkerfehler wegen mehrfacher Definition. Das liegt natürlich daran, dass über das #include dieselbe Variable sowohl in der my.cpp als auch main.cpp definiert werden (und somit Speicher reserviert wird).
Was ich nicht verstehe ist, warum der Linker sich um so etwas kümmert? Nach allen Beschreibungen die ich so finden konnte verknüpft er doch bloß Objektdateien die den vom Compiler erstellten Maschinencode enthalten, und der Maschinencode ist natürlich frei von irgendwelchen Variablenbezeichnern und enthält bloß noch Adressen, also woran erkennt der Linker noch dass irgend eine Variable doppelt definiert war?
PS: Ich hab schon die Vermutung, dass die Frage zu sehr ins Detail geht und man sich sehr genau mit der Funktionsweise von Compiler und Linker beschäftigen muss um das nachzuvollziehen, aber vll kann ja trotzdem wer ne einfache Erklärung liefern.