El compilador no lo sabe. Tu tienes por ejemplo los siguientes archivos:
- Main.cpp
- HolaMundo.cpp
- HolaMundo.h
Tu Main.cpp incluye a HolaMundo.h y llama al constructor. En HolaMundo.h solo esta el prototipo. Al compilar, por ejemplo con gcc, compilas Main.cpp con la opcion -c que lo que hace es simplemente no enlazar. Luego compilas HolaMundo.cpp con la misma opcion. Finalmente enlazas los archivos objeto resultantes en la compilacion con el comando ld y (probablemente) la opcion -zmuldefs.
Entonces lo que haces es esto (en la consola):
g++ -c Main.cpp -o Main.o
g++ -c HolaMundo.cpp -o HolaMundo.o
ld -zmuldefs -o HolaMundo Main.o HolaMundo.o
Y luego ejecutas tu programa HolaMundo.
Como te habras dado cuenta, tu le dices explicitamente al compilador y enlazador que es lo que debe hacer.
Lo que produce confusion, es que los IDEs hacen todo esto por si solos y uno ni se entera! Por eso prefiero usar automake creando yo mismo los makefiles o pedirle a alguien que construya las ordenes con SCons. Espero se haya entendido.
Saludos.