Linker->unaufgelöstes Symbol



  • Hallo zusammen,
    Visual Studio 2010 gibt mir beim Compilen meiner Anwendung aus, dass dass Objekt Matrix::InvertMatrix nicht aufgelöst sei (linkergfehler), und zwar für jede Datei, in der es vorkommt.
    Die H-Datei in der Die Methode deklariert ist, wird in allen Dateien wo sie verwendet wir eingebungden und die Methode wird auch aufgelöst, also ich habe sie nichjt nur definiert (in der H-Datei) sondern auch Implementiert.
    Ich hoffe mir kann jemand halfen.


  • Mod

    Das klingt auf jeden Fall schon einmal höchst verdächtig, wenn du Sachen in .h-Dateien definierst. Und sonst kann man ohne konkreten Code nur sagen: Der Linker hat mit Sicherheit Recht und du nicht.



  • Ok, hier mal der Code:

    // Matrix.h
    namespace ge
    {
    	class Vector3;
    	GE_API Matrix MatrixInvert(const Matrix& m);
    
    	class GE_API Matrix
    	{
              ...
            }
            GE_API Matrix MatrixInvert(const Matrix& m);
    
    // Matrix.cpp
    using namespace ge;
    
    GE_API Matrix MatrixInvert(const Matrix& m)
    {
    	float fInvDet = MatrixDet(m);
    	if(fInvDet == 0.0f) 
    		return MatrixIdentity();
    	fInvDet = 1.0f / fInvDet;
    
    	Matrix mResult;
    
    	mResult.m11 =  fInvDet * (m.m22 * m.m33 - m.m23 * m.m32);
    	mResult.m12 = -fInvDet * (m.m12 * m.m33 - m.m13 * m.m32);
    	mResult.m13 =  fInvDet * (m.m12 * m.m23 - m.m13 * m.m22);
    	mResult.m14 =  0.0f;
    	mResult.m21 = -fInvDet * (m.m21 * m.m33 - m.m23 * m.m31);
    	mResult.m22 =  fInvDet * (m.m11 * m.m33 - m.m13 * m.m31);
    	mResult.m23 = -fInvDet * (m.m11 * m.m23 - m.m13 * m.m21);
    	mResult.m24 =  0.0f;
    	mResult.m31 =  fInvDet * (m.m21 * m.m32 - m.m22 * m.m31);
    	mResult.m32 = -fInvDet * (m.m11 * m.m32 - m.m12 * m.m31);
    	mResult.m33 =  fInvDet * (m.m11 * m.m22 - m.m12 * m.m21);
    	mResult.m34 =  0.0f;
    	mResult.m41 = -(m.m41 * mResult.m11 + m.m42 * mResult.m21 + m.m43 * mResult.m31);
    	mResult.m42 = -(m.m41 * mResult.m12 + m.m42 * mResult.m22 + m.m43 * mResult.m32);
    	mResult.m43 = -(m.m41 * mResult.m13 + m.m42 * mResult.m23 + m.m43 * mResult.m33);
    	mResult.m44 =  1.0f;
    
    	return mResult;
    }
    

    Hier nochmal die Fehlermeldung:

    Vector3.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class ge::Matrix __cdecl ge::MatrixInvert(class ge::Matrix const &)" (?MatrixInvert@ge@@YA?AVMatrix@1@ABV21@@Z)".
    1>Matrix.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class ge::Matrix __cdecl ge::MatrixInvert(class ge::Matrix const &)" (?MatrixInvert@ge@@YA?AVMatrix@1@ABV21@@Z)".
    1>Memory.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class ge::Matrix __cdecl ge::MatrixInvert(class ge::Matrix const &)" (?MatrixInvert@ge@@YA?AVMatrix@1@ABV21@@Z)".
    1>Utils.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class ge::Matrix __cdecl ge::MatrixInvert(class ge::Matrix const &)" (?MatrixInvert@ge@@YA?AVMatrix@1@ABV21@@Z)".
    1>Vector2.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class ge::Matrix __cdecl ge::MatrixInvert(class ge::Matrix const &)" (?MatrixInvert@ge@@YA?AVMatrix@1@ABV21@@Z)".
    1>Direct3D.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""class ge::Matrix __cdecl ge::MatrixInvert(class ge::Matrix const &)" (?MatrixInvert@ge@@YA?AVMatrix@1@ABV21@@Z)" in Funktion ""public: class ge::Matrix & __thiscall ge::Matrix::operator/=(class ge::Matrix const &)" (??_0Matrix@ge@@QAEAAV01@ABV01@@Z)".
    1>DMXConfig.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class ge::Matrix __cdecl ge::MatrixInvert(class ge::Matrix const &)" (?MatrixInvert@ge@@YA?AVMatrix@1@ABV21@@Z)".
    1>GraphicEngine.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class ge::Matrix __cdecl ge::MatrixInvert(class ge::Matrix const &)" (?MatrixInvert@ge@@YA?AVMatrix@1@ABV21@@Z)".
    1>Log.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""class ge::Matrix __cdecl ge::MatrixInvert(class ge::Matrix const &)" (?MatrixInvert@ge@@YA?AVMatrix@1@ABV21@@Z)".


  • Mod

    Da hast du nix im Header definiert (und das ist auch so in Ordnung), aber stattdessen wirst du wohl das Ergebnis deiner Matrix.cpp nicht mitgelinkt haben.

    edit: Und GE_API wird doch wohl einfach nichts sein, oder?



  • afair mußt du für die Definition einer Funktion deren Namensraum explizit angeben - so hast du zwar eine Funktion ::MatrixInvert() definiert, aber nicht das anderswo benötigte ge::MatrixInvert().


  • Mod

    CStoll schrieb:

    afair mußt du für die Definition einer Funktion deren Namensraum explizit angeben - so hast du zwar eine Funktion ::MatrixInvert() definiert, aber nicht das anderswo benötigte ge::MatrixInvert().

    Ja, gar nicht gesehen, dass die Definition außerhalb des Namespace ist. Das wird es sein.



  • Jetzt klappts. Danke.


Anmelden zum Antworten