Forum: PC-Programmierung C++: undefined reference to..


von Kern S. (kernspalt)


Lesenswert?

Mojn, ich habe ein Übungsprogramm geschrieben das aus mehreren Dateien 
besteht, ich bekomme es aber nicht zum Laufen und die Fehlermeldung sagt 
mir leider gar nichts.

Das ist der Code:

main.cpp
1
#include "../../../std_lib_facilities_C++11.h"
2
#include "my.h"
3
4
int foo;
5
6
int main()
7
{
8
    foo = 7;        // Wenn auskommentiert wird foo standardmäßig mit 0 erstellt/initialisiert/definiert
9
    print_foo();
10
    print(99);
11
}


my.h
1
// Declarations
2
extern int foo;
3
void print_foo();
4
void print(int);


my.cpp
1
#include "../../../std_lib_facilities_C++11.h"
2
#include "my.h"
3
4
// Definitions
5
void print_foo()
6
{
7
    cout << foo << '\n';
8
}
9
10
void print(int i)
11
{
12
    cout << i << '\n';
13
}



Und das sind die Fehlermeldungen:
G:\02. Programmierung\C++\chap8\drills\drill1\use.o:use.cpp|| undefined 
reference to `print_foo()'

G:\02. Programmierung\C++\chap8\drills\drill1\use.o:use.cpp|| undefined 
reference to `print(int)'

error: ld returned 1 exit status

von foobar (Gast)


Lesenswert?

Du musst my.cpp auch compilieren und beim Linken das dabei entstandene 
my.o mitlinken.

von Rolf M. (rmagnus)


Lesenswert?

Kern S. schrieb:
> Mojn, ich habe ein Übungsprogramm geschrieben das aus mehreren Dateien
> besteht, ich bekomme es aber nicht zum Laufen und die Fehlermeldung sagt
> mir leider gar nichts.

Die Fehlermeldung kommt vom Linker und besagt, dass auf die Funktionen 
print_foo und print verwiesen wird und diese zwar deklariert, aber nicht 
definiert sind (undefined reference). Der Linker findet also die 
Implementation dieser beiden Funktionen nicht. Wie "foobar" sagt, linkst 
du my.o wohl nicht zu deinem Programm. Wie sieht denn dein Makefile aus?

Hier noch ein paar Anmerkungen zu deinem Code:

>#include "../../../std_lib_facilities_C++11.h"

Solche relativen Pfade sollte man vermeiden. Besser ist es, das 
Verzeichnis dem Compiler über dessen Kommandozeilen-Option -I als 
Suchverzeichnis für Header bekannt zu machen.

> int foo;
>
> int main()
> {
>     foo = 7;        // Wenn auskommentiert wird foo standardmäßig mit 0
> erstellt/initialisiert/definiert

Du kannst auch einfach gleich oben
1
int foo = 7;
schreiben.

Und deiner Datei my.h fehlt ein Include Guard.

: Bearbeitet durch User
von Kern S. (kernspalt)


Lesenswert?

Rolf M. schrieb:
> Wie "foobar" sagt, linkst du my.o wohl nicht zu deinem Programm. Wie
> sieht denn dein Makefile aus?

Ich dachte schon in dem einfachen Code verbirgt sich ein Fehler den ich 
nicht sehe. Danke für den Hinweis.

Ich habe bisher immer nur mit einer cpp Datei gearbeitet, mit Makefiles 
habe ich bis jetzt zu tun gehabt. Codeblocks hat immer anstandslos 
kompiliert und die exe erstellt.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.