| Autor |
Nachricht |
pumuckl
Moderator
Benutzerprofil
Anmeldungsdatum: 21.06.2005
Beiträge: 7326
|
pumuckl Moderator
09:28:05 03.08.2009 Titel: |
undefined reference to XXYY |
Zitieren |
Ein häufiges Problem ist ein Linkerfehler mit dem Wortlaut "undefined reference", "unaufgelöster externer Verweis" oder ähnliches.
Dieser Fehler taucht dann auf, wenn Funktionen oder Variablen deklariert, aber nicht definiert worden sind. Auf Folgendes ist zu achten:
- Die Übersetzungseinheit (meist eine .cpp oder eine Bibliothek), die die fehlende Variablen- oder Funktionsdefinition enthält, muss dem Linker mit übergeben werden, bei IDEs heißt das, dass sie mit im Projekt eingebunden werden muss.
- Bei statischen Klassenvariablen muss in der Übersetzungseinheit eine Definition existieren. Für integrale Konstanten kann dies gleich in der Klassendefinition geschehen, alle anderen Typen und nichtkonstante integrale Member müssen außerhalb der Klasendefinition definiert werden:
| C++: | 1 2 3 4 5 6 7 8 9 | //foo.h
struct foo
{
static const int i = 5; //Deklaration + Definition einer integralen statischen Konstanten
static std::string s; //Deklaration
};
//foo.cpp
std::string foo::s = "statisch!"; //Definition in der .cpp | |
Die Definition muss in der .cpp geschehen, da sonst in jeder ÜE eine Definition vorhanden wäre.
- Bei Templates müssen alle Definitionen in der Headerdatei erfolgen. Templates haben keine eigene Übersetzungseinheit, d.h. keine .cpp. Das liegt daran, dass zum Zeitpunkt der Instantiierung die kompletten Definitionen für den Compiler sichtbar sein müssen. Hier braucht man im Gegensatz zu nicht-Templates keine Angst vor Mehrfachdefinitionen in verschiedenen Headern zu haben, der Linker erkennt Templateklassen und -funktionen und ignoriert die zusätzlichen Definitionen.
- Die Definition einer Funktion muss die selbe Signatur haben wie ihre Deklarationen. Jedes const zählt!
|
_________________ Du brauchst Hilfe? - Forenregeln. Den richtigen Code posten - machs uns einfacher dir zu helfen
Don't feed the Help Vampires!
Zuletzt bearbeitet von pumuckl am 11:50:31 30.05.2012, insgesamt 4-mal bearbeitet |
|
 |
Werbeunterbrechung
|
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum nicht antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|