"Nicht aufgelöstes externes Symbol" bei Klasse mit Templates
-
Hallo,
ich habe in Visual C++ ein leeres Win32-Konsolenprojekt erstellt, die Klassen von http://archive.ncsa.uiuc.edu/VEG/VPS/emtc/quaternions/ integriert und bekomme beim Kompilieren des Projektes immer mehrere Fehler vom Typ:
error LNK2019: Nicht aufgelöstes externes Symbol '"public: void __thiscall Quaternion<float>::QuatRotation(float * const)" (?QuatRotation@?$Quaternion@M@@QAEXQAM@Z)', verwiesen in Funktion '_main'
Ich bin am verzweifeln, ich weiß einfach nicht warum
. Jede Klasse einzeln lässt sich problemlos kompilieren, aber zusammen gibts dann insgesamt 23 dieser Fehler.
Kann mir jemand einen Hinweis geben?
Schönen Dank im voraus
RolandDie Klassen im Einzelnen:
http://archive.ncsa.uiuc.edu/VEG/VPS/emtc/quaternions/quaternion.h
http://archive.ncsa.uiuc.edu/VEG/VPS/emtc/quaternions/quaternion.c++Im tarball ist dann noch eine test.c++:
// Quaternion test class #include "quaternion.h" int main(int argc, char **argv) { cout << "Quaternion class test" << endl; cout << "Constructors:" << endl; float vect[4] = { 5, 6, 7, 8 }; float v[3]= { 1.1, 2.34, 7.65 }; Quaternion <float> q1; Quaternion <float> q2(1.0f, 2.0f, 3.0f, 4.0f); Quaternion <float> q3(q2); Quaternion <float> q4(vect); Quaternion <float> q7(3.0f, 1.0f, -2.0f, 1.0f); Quaternion <float> q8(2.0f, -1.0f, 2.0f, 3.0f); Quaternion <float> q9(3.0f, 1.0f, -2.0f, 1.0f); Quaternion <float> q16(0.0f, 1.1f, 2.34f, 7.65f); cout << "q1=" << q1 << endl; cout << "q2=" << q2 << endl; cout << "q3=" << q3 << endl; cout << "q4=" << q4 << endl; cout << "Operators:" << endl; cout << "Operator =" << endl; Quaternion <float> q5 = q2; cout << "q5 = " << q5 << endl; cout << "Operator +" << endl; Quaternion <float> q6 = q5 + q4; cout << "q5 + q4 = " << q6 << endl; //should equal (6,8,10,12) cout << "Operator -" << endl; q6 = q5 - q4; cout << "q5 - q4 = " << q6 << endl; //should equal (-4,-4,-4,-4) cout << "Operator *" << endl; q6 = q7 * q8; cout << "q7 * q8 = " << q6 << endl; //should equal (8,-9,-2,11) cout << "Operator /" << endl; q6 = q8.inverse(); cout << "q7/(q8.inverse) = " << q7/q6 << endl;//should equal [8, (-9, -2, 11)] cout << "Operator += " << endl; q4 += q5; cout << "q4 += q5 is " << q4 << endl;//should equal [6, (8, 10, 12)] cout << "Operator -= " << endl; q5 -= q5; cout << "q5 -= q5 is " << q5 << endl;//should equal [0, (0, 0, 0)] cout << "Operator *= " << endl; q7 *= q8; cout << "q7 *= q8 is " << q7 << endl;//should equal [8, (-9, -2, 11)] cout << "Operator /= " << endl; q7= q9; q6 = q8.inverse(); q7/=q6; cout << "q7 /= q8.inverse() is " << q7 << endl;//should equal [8, (-9, -2, 11)] cout << "Operator != " << endl; if (q2 != q2) cout << "doesn't work:(" << endl; else cout << "works!" << endl; cout << "Operator == " << endl; if (q2 == q2) cout << "works!" << endl; else cout << "doesn't work:(" << endl; cout << "Norm of q2 = " << q2.norm() << endl; //30 cout << "Magnitude of q2 = " << q2.magnitude() << endl; //5.4772255.... q6 = q2.scale(2); cout << "Scale of q2 by 2 = " << q6 << endl;//should equal [2, (4, 6, 8)] cout << "Inverse of q8 = " << q8.inverse() << endl;//should equal [0.111..., (0.0555..., -0.111..., -0.1666...)] cout << "Conjugate of q8 = " << q8.conjugate() <<endl; //should equal (2,1,-2,-3) cout << "Unit Quaternion of q8 is " << q8.UnitQuaternion() << endl; //QuatRot q8.QuatRotation(v); cout << "Rotate q8 by 1.1, 2.34, 7.65 = " << v[0] << ", " << v[1] << ", " << v[2] << endl; //should get the same answer as QuatRot(v, q8) ignoring the w factor q2=q8*q16; q3=q2*(q8.inverse()); cout << q3 << endl; #ifdef SHOEMAKE float v1[3] = { 2.3f, 3.2f, 4.3f }; cout << "\nEuler -> Quaternion convertion test:" << endl; cout << " -in vector: (" << v1[0] << ", " << v1[1] << ", " << v1[2] << ")" << endl; Quaternion <float> q10(v1, EulOrdZYXs); cout << " -out quaternion: " << q10 << endl; cout << "Quaternion -> Euler convertion test:" << endl; cout << " -in quaternion: " << q10 << endl; q10.toEuler(v1, EulOrdZYXs); cout << " -out vector: (" << v1[0] << ", " << v1[1] << ", " << v1[2] << ")" << endl; #endif return 1; }
-
du musst die entsprechende library dazulinken.
sie liegt sicher bei, entweder schon gepackt, oder in form von c/cpp files, die du selber noch durch einen entsprechenden makefile zu eine library fassen kannst. (oder so dazu linkst)
der linker sucht die "körper" der funktionen, die du ihm ankündigst und gebrauchst.
ps: ich sehe grad, die cpp files sind ja beim download offen dabei, du kannst sie also einfach in dein projekt mit einbinden. (haben suffix .c++)
so long
-
tja, genau das habe ich auch schon gemacht, mit "Projekt->vorhandenes Element hinzufügen". Den Suffix habe ich auf .cpp geändert, aber das sollte ja ok sein.
Genau da liegt aber auch meine Verwunderung: Ich habe die "quaternion.cpp" und "test.cpp" sogar einzeln kompiliert (rechte Maustaste auf Datei->Kompilieren) und kein Problem. Beim Gesamtprojekt erstellen erscheinen aber obige Fehler.
Irgendetwas in den Projekt-Eigenschaften muss bestimmt noch geändert werden. Es existert tatsähclich ein Makefile im tarball, aber das ist ja nur für Linux interessant.
Kann man noch was machen, vielleicht die quaternion.cpp als extra Lib erstellen? Ist ja eigentlich nicht nötig, oder? Wie macht man sowas unter VS C++.NET?
Danke
Roland
-
hast du das gelesen?
http://archive.ncsa.uiuc.edu/VEG/VPS/emtc/quaternions/Here we have provided a C++ class for quaternional algebra. You need these two files: quaternion.h & quaternion.c++. To be able to work with Euler angles, you also need to download Ken Shoemake's QuatTypes.h, EulerAngles.h, EulerAngles.c and define SHOEMAKE in your makefile. Here is an example how to use it all together: (test.c++) and a makefile. For more on quaternions, read Prof. George Francis's introduction lecture.
für den test, den du versuchst, brauchst du das andere auch.
-
elise schrieb:
für den test, den du versuchst, brauchst du das andere auch.
jein, nur wenn ich in die Präprozessordefiniton "SHOEMAKE" schreibe. Allerdings habe ich die entsprechenden Euler-Klassen schon integriert, gleicher Fehler (wollte das Beispiel nicht komplizierter machen als es schon ist). Ebenfalls versucht, die C-Datei "EulerAngels.c" als c++ Klasse umzuschreiben, selber Fehler.
Ich vermute, es hat was mit diesen Templates zu tun, aber mir erscheint die Notation richtig. Ist irgendwie merkwürdig ...
-
Bei Templates gehört die Implementierung in das h-File!!!!!!!! Dann gibts auch keine Linkerfehler.
-
ChrisPlusPlus schrieb:
Bei Templates gehört die Implementierung in das h-File!!!!!!!! Dann gibts auch keine Linkerfehler.
Das ist es!! Jetzt funzt alles
Ich danke dir und elise sehr herzlich für die Mühe und wünsche euch noch einen schönen Tag