verweis auf nicht aufgelöstes externes symbol
-
Ich habe eine Klasse die Laufwerke verwaltet und dort eine Funktion die wiefolgt deklariert ist:
pubic: unsigned __int64 TotalFreeSpace();und so ist sie definiert:
inline unsigned __int64 Drive::TotalFreeSpace(){ unsigned __int64 num; GetDiskFreeSpaceEx(cRootPath, NULL, NULL, (PULARGE_INTEGER)&num); return num; }Dann rufe ich das ganze so auf:
Drive drive = Drive("E:\\"); cout << drive.TotalFreeSpace() << endl;Doch wieso kommt dann dieser Fehler:
Fehler 12 error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""public: unsigned __int64 __thiscall Drive::TotalFreeSpace(void)" (?TotalFreeSpace@Drive@@QAE_KXZ)" in Funktion "_main".
-
In welcher Datei ist die Funktion implementiert? Warum ist sie inline?
-
Deklariert: Drive.h
Definiert: Drive.cppAufgerufen: main.cpp
-
Du weißt hoffentlich, was "inline" bedeutet. Das bedeutet, daß der Compiler den Funktionsinhalt direkt dort einsetzen darf wo die Funktion benötigt wird. Das geht aber nur, wenn er den Quelltext an der Stelle kennt (d.h. wenn sie in der selben Datei definiert wurde). So, wie du die Funktion verwenden willst, ist das inline überflüssig.
-
CStoll schrieb:
So, wie du die Funktion verwenden willst, ist das inline überflüssig.
Es ist sogar die Ursache des Fehlers.
-
omg danke. Das ist mein erstes Projekt in c++ davor war ich nur in c# unterwegs. Und ja ich weiß zwar, dass der compiler dann praktisch nicht die funktion aufruft sondern direkt "in die zeile" reinkopiert doch ansowas hab ich nicht gedacht.
also danke

-
CStoll schrieb:
Du weißt hoffentlich, was "inline" bedeutet. Das bedeutet, daß der Compiler den Funktionsinhalt direkt dort einsetzen darf wo die Funktion benötigt wird.
Das ist so nicht richtig.
Wichtig bei "inline" ist die Referenz auf die "one definition rule", die in jedem schlauen C++ Buch stehen und die jeder C++ Programmierer kennen sollte. Diese Regel besagt u.a.:
- Eine inline-Funktion [1] darf in mehreren Übersetzungseinheiten definiert werden.
- Wenn eine inline-Funktion in einer Übersetzungseinheit "verwendet" wird, muss sie auch in derselben ÜE definiert sein.
Der Thread-Ersteller hat hier die ODR verletzt, da er eine inline-Funktion [1] in einer ÜE benutzt hat, in der die Definition nicht vorlag. Aufgrund der obigen Regeln ist es nämlich einem Compiler erlaubt, eine Definition einer inline-Funktion, die gar nicht verwendet wird, komplett zu ignorieren. Wenn also eine inline-Funktion in nur einer ÜE definiert wird, wo sie nicht mal benutzt wird, taucht sie auch nicht unbedingt in der Objektdatei auf. Deswegen findet sie der Linker auch nicht in Deinem Fall...
Wie diese Regeln das Inlining [2] begünstigen, kann man sich ja dann denken, ne? Inlining darf er natürlich auch bei nicht-inline-Funktionen machen. Und umgekehrt bedeutet das inline-Schlüsselwort keinen Zwang zum Inlining.
[1] inline-Funktion = eine Funktion, die entweder mit dem inline-Schlüsselwort deklariert wurde oder innerhalb einer struct/class-Definition definiert wurde.
[2] Inlining = der Compiler ersetzt einen Funktionsaufruf durch den Programmcode der Funktion selbst
-
krümelkacker schrieb:
CStoll schrieb:
Du weißt hoffentlich, was "inline" bedeutet. Das bedeutet, daß der Compiler den Funktionsinhalt direkt dort einsetzen darf wo die Funktion benötigt wird.
Das ist so nicht richtig.
Hat dir schonmal jemand gesagt, daß du deinem Namen alle Ehre machst
