Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

28.05.2005, 00:52

oo verständis problem in verbindung mit LNK2019

hi

Ich benutze davids engine, möchte sie aber nicht als dll in meinem projekt einbinden und um sie auch richtig zu verstehen benutze ich auch nicht die statische lib.
Jezt bekomm ich 2 linkerror 2019 und weiss nicht weiter.

Compilerausgabe:

Utils.obj : error LNK2019: unresolved external symbol "class Matrix __cdecl MatrixTranspose(class Matrix const &)" (?MatrixTranspose@@YA?AVMatrix@@ABV1@@Z) referenced in function "class Vector2 __cdecl Vector2TransformNormal(class Vector2 const &,class Matrix const &)" (?Vector2TransformNormal@@YA?AVVector2@@ABV1@ABVMatrix@@@Z)

Utils.obj : error LNK2019: unresolved external symbol "class Matrix __cdecl MatrixInvert(class Matrix const &)" (?MatrixInvert@@YA?AVMatrix@@ABV1@@Z) referenced in function "class Vector2 __cdecl Vector2TransformNormal(class Vector2 const &,class Matrix const &)" (?Vector2TransformNormal@@YA?AVVector2@@ABV1@ABVMatrix@@@Z)

alle klassen in mit denen der TB enigine (lediglich ohne tb prefix) identich, nur die dll exports wurden weggelassen.



C-/C++-Quelltext

1
2
3
4
5
6
7
8
// Verwendete Symbole vordeklarieren

class Vector2;
class Vector3;
class Matrix;
class Plane;
class Model;
class Octree;
struct OctreeNode;

Datei: Utils.h

ich vermute es leigt an der symbol vordeklaration.

auf Hilfe hoffend

mfg
epsilon2

mfg

2

28.05.2005, 09:49

Löschen

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

3

28.05.2005, 09:52

Noch'n paar Tipps:
- entferne alle "TRIBASE_API"
- packe das, was in der "DllMain" steht, irgendwo in die "WinMain"
- ersetze alle "TB_DLL_HANDLE" durch "GetModuleHandle(0)"

4

28.05.2005, 12:50

es erklät noch nicht meinen lnk 2019 der im util.obj entsteht und auf Matrix.h verweist.

mfg
epsilon2

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

28.05.2005, 12:56

Möglicherweise schon.
Hast Du es denn ausprobiert?

6

28.05.2005, 18:58

direct input benutze ich noch nicht, sonst sehe ich nicht ein warum ich TB_DLL_Handle benutzen sollte.

alles andere ist schon geschehen.

trozdem behalte ich meine link errror

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// ******************************************************************

// 2D-Richtungsvektor transformieren

Vector2 Vector2TransformNormal(const Vector2& v,const Matrix& m)                                               
{
    // Vektorlänge berechnen

    const float fLength = Vector2Length(v);
    if(fLength == 0.0f) return v;

    // Transponierte inverse Matrix berechnen


    const Matrix mTransform( MatrixTranspose(MatrixInvert(m)));

    // Vektor mit Matrix transformieren und ursprüngliche Länge wiederherstellen

    return Vector2Normalize(Vector2(v.x * mTransform.m11 + v.y * mTransform.m21,
                                        v.x * mTransform.m12 + v.y * mTransform.m22))
           * fLength;
}

eine verursachende funktion sieht dann wie fogt aus.

und Matrix.h etwa so

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
#pragma once

#include "stdafx.h"

// Verwendete Symbole vordefinieren

class Vector2;
class Vector3;
Matrix MatrixInvert(const Matrix& m);

// ******************************************************************

// Die Matrixklasse

class Matrix
{
public:
    // Variablen

    union
    {
        struct
        {
            float m11, m12, m13, m14,   // Elemente der Matrix

                  m21, m22, m23, m24,
                  m31, m32, m33, m34,
                  m41, m42, m43, m44;
        };

        float       m[4][4];            // Zweidimensionales Array der Elemente

        float       n[16];              // Eindimensionales Array der Elemente

        D3DMATRIX   mD3DMatrix;         // Matrix als D3DMATRIX

    };

    // Konstruktoren

    Matrix() {}

    Matrix(const Matrix& m) : m11(m.m11), m12(m.m12), m13(m.m13), m14(m.m14),
                              m21(m.m21), m22(m.m22), m23(m.m23), m24(m.m24),
                              m31(m.m31), m32(m.m32), m33(m.m33), m34(m.m34),
                              m41(m.m41), m42(m.m42), m43(m.m43), m44(m.m44) {}

    Matrix(float _m11, float _m12, float _m13, float _m14,
           float _m21, float _m22, float _m23, float _m24,
           float _m31, float _m32, float _m33, float _m34,
           float _m41, float _m42, float _m43, float _m44) : m11(_m11), m12(_m12), m13(_m13), m14(_m14),
                                                             m21(_m21), m22(_m22), m23(_m23), m24(_m24),
                                                             m31(_m31), m32(_m32), m33(_m33), m34(_m34),
                                                             m41(_m41), m42(_m42), m43(_m43), m44(_m44) {}

    Matrix(const float* pfValue) : mD3DMatrix(*((D3DMATRIX*)(pfValue))) {}
    Matrix(const D3DMATRIX& m) : mD3DMatrix(m)                          {}

    // Casting-Opeatoren

    operator float* ()                  {return (float*)(n);}
    operator D3DMATRIX& ()              {return mD3DMatrix;}
    operator const D3DMATRIX& () const  {return mD3DMatrix;}

    // Zugriffsoperatoren

    float& operator () (int iRow, int iColumn) {return m[iRow - 1][iColumn - 1];}
    float operator () (int iRow, int iColumn) const {return m[iRow - 1][iColumn - 1];}

    // Zuweisungsoperatoren

    Matrix& operator = (const Matrix& m) {mD3DMatrix = m.mD3DMatrix; return *this;}
    
    Matrix& operator += (const Matrix& m)
    {
        m11 += m.m11; m12 += m.m12; m13 += m.m13; m14 += m.m14;
        m21 += m.m21; m22 += m.m22; m23 += m.m23; m24 += m.m24;
        m31 += m.m31; m32 += m.m32; m33 += m.m33; m34 += m.m34;
        m41 += m.m41; m42 += m.m42; m43 += m.m43; m44 += m.m44;
        return *this;
    }

    Matrix& operator -= (const Matrix& m)
    {
        m11 -= m.m11; m12 -= m.m12; m13 -= m.m13; m14 -= m.m14;
        m21 -= m.m21; m22 -= m.m22; m23 -= m.m23; m24 -= m.m24;
        m31 -= m.m31; m32 -= m.m32; m33 -= m.m33; m34 -= m.m34;
        m41 -= m.m41; m42 -= m.m42; m43 -= m.m43; m44 -= m.m44;
        return *this;
    }

    Matrix& operator *= (const Matrix& m)
    {
        return *this = Matrix(m.m11 * m11 + m.m21 * m12 + m.m31 * m13 + m.m41 * m14,
                              m.m12 * m11 + m.m22 * m12 + m.m32 * m13 + m.m42 * m14,
                              m.m13 * m11 + m.m23 * m12 + m.m33 * m13 + m.m43 * m14,
                              m.m14 * m11 + m.m24 * m12 + m.m34 * m13 + m.m44 * m14,
                              m.m11 * m21 + m.m21 * m22 + m.m31 * m23 + m.m41 * m24,
                              m.m12 * m21 + m.m22 * m22 + m.m32 * m23 + m.m42 * m24,
                              m.m13 * m21 + m.m23 * m22 + m.m33 * m23 + m.m43 * m24,
                              m.m14 * m21 + m.m24 * m22 + m.m34 * m23 + m.m44 * m24,
                              m.m11 * m31 + m.m21 * m32 + m.m31 * m33 + m.m41 * m34,
                              m.m12 * m31 + m.m22 * m32 + m.m32 * m33 + m.m42 * m34,
                              m.m13 * m31 + m.m23 * m32 + m.m33 * m33 + m.m43 * m34,
                              m.m14 * m31 + m.m24 * m32 + m.m34 * m33 + m.m44 * m34,
                              m.m11 * m41 + m.m21 * m42 + m.m31 * m43 + m.m41 * m44,
                              m.m12 * m41 + m.m22 * m42 + m.m32 * m43 + m.m42 * m44,
                              m.m13 * m41 + m.m23 * m42 + m.m33 * m43 + m.m43 * m44,
                              m.m14 * m41 + m.m24 * m42 + m.m34 * m43 + m.m44 * m44);
    }

    Matrix& operator *= (const float f)
    {
        m11 *= f; m12 *= f; m13 *= f; m14 *= f;
        m21 *= f; m22 *= f; m23 *= f; m24 *= f;
        m31 *= f; m32 *= f; m33 *= f; m34 *= f;
        m41 *= f; m42 *= f; m43 *= f; m44 *= f;
        return *this;
    }
    
    Matrix& operator /= (const Matrix& m)
    {
        return *this *= MatrixInvert(m);
    }

    Matrix& operator /= (const float f)
    {
        m11 /= f; m12 /= f; m13 /= f; m14 /= f;
        m21 /= f; m22 /= f; m23 /= f; m24 /= f;
        m31 /= f; m32 /= f; m33 /= f; m34 /= f;
        m41 /= f; m42 /= f; m43 /= f; m44 /= f;
        return *this;
    }
};

// Arithmetische Operatoren

inline Matrix operator + (const Matrix& a, const Matrix& b) {return Matrix(a.m11 + b.m11, a.m12 + b.m12, a.m13 + b.m13, a.m14 + b.m14, a.m21 + b.m21, a.m22 + b.m22, a.m23 + b.m23, a.m24 + b.m24, a.m31 + b.m31, a.m32 + b.m32, a.m33 + b.m33, a.m34 + b.m34, a.m41 + b.m41, a.m42 + b.m42, a.m43 + b.m43, a.m44 + b.m44);}
inline Matrix operator - (const Matrix& a, const Matrix& b) {return Matrix(a.m11 - b.m11, a.m12 - b.m12, a.m13 - b.m13, a.m14 - b.m14, a.m21 - b.m21, a.m22 - b.m22, a.m23 - b.m23, a.m24 - b.m24, a.m31 - b.m31, a.m32 - b.m32, a.m33 - b.m33, a.m34 - b.m34, a.m41 - b.m41, a.m42 - b.m42, a.m43 - b.m43, a.m44 - b.m44);}
inline Matrix operator - (const Matrix& m)                      {return Matrix(-m.m11, -m.m12, -m.m13, -m.m14, -m.m21, -m.m22, -m.m23, -m.m24, -m.m31, -m.m32, -m.m33, -m.m34, -m.m41, -m.m42, -m.m43, -m.m44);}

inline Matrix operator * (const Matrix& a,
                            const Matrix& b)
{
    return Matrix(b.m11 * a.m11 + b.m21 * a.m12 + b.m31 * a.m13 + b.m41 * a.m14,
                    b.m12 * a.m11 + b.m22 * a.m12 + b.m32 * a.m13 + b.m42 * a.m14,
                    b.m13 * a.m11 + b.m23 * a.m12 + b.m33 * a.m13 + b.m43 * a.m14,
                    b.m14 * a.m11 + b.m24 * a.m12 + b.m34 * a.m13 + b.m44 * a.m14,
                    b.m11 * a.m21 + b.m21 * a.m22 + b.m31 * a.m23 + b.m41 * a.m24,
                    b.m12 * a.m21 + b.m22 * a.m22 + b.m32 * a.m23 + b.m42 * a.m24,
                    b.m13 * a.m21 + b.m23 * a.m22 + b.m33 * a.m23 + b.m43 * a.m24,
                    b.m14 * a.m21 + b.m24 * a.m22 + b.m34 * a.m23 + b.m44 * a.m24,
                    b.m11 * a.m31 + b.m21 * a.m32 + b.m31 * a.m33 + b.m41 * a.m34,
                    b.m12 * a.m31 + b.m22 * a.m32 + b.m32 * a.m33 + b.m42 * a.m34,
                    b.m13 * a.m31 + b.m23 * a.m32 + b.m33 * a.m33 + b.m43 * a.m34,
                    b.m14 * a.m31 + b.m24 * a.m32 + b.m34 * a.m33 + b.m44 * a.m34,
                    b.m11 * a.m41 + b.m21 * a.m42 + b.m31 * a.m43 + b.m41 * a.m44,
                    b.m12 * a.m41 + b.m22 * a.m42 + b.m32 * a.m43 + b.m42 * a.m44,
                    b.m13 * a.m41 + b.m23 * a.m42 + b.m33 * a.m43 + b.m43 * a.m44,
                    b.m14 * a.m41 + b.m24 * a.m42 + b.m34 * a.m43 + b.m44 * a.m44);
}

inline Matrix operator * (const Matrix& m,
                            const float f)
{
    return Matrix(m.m11 * f, m.m12 * f, m.m13 * f, m.m14 * f,
                    m.m21 * f, m.m22 * f, m.m23 * f, m.m24 * f,
                    m.m31 * f, m.m32 * f, m.m33 * f, m.m34 * f,
                    m.m41 * f, m.m42 * f, m.m43 * f, m.m44 * f);
}

inline Matrix operator * (const float f,
                            const Matrix& m)
{
    return Matrix(m.m11 * f, m.m12 * f, m.m13 * f, m.m14 * f,
                    m.m21 * f, m.m22 * f, m.m23 * f, m.m24 * f,
                    m.m31 * f, m.m32 * f, m.m33 * f, m.m34 * f,
                    m.m41 * f, m.m42 * f, m.m43 * f, m.m44 * f);
}

inline Matrix operator / (const Matrix& a, const Matrix& b) {return a * MatrixInvert(b);}

inline Matrix operator / (const Matrix& m,
                            const float f)
{
    return Matrix(m.m11 / f, m.m12 / f, m.m13 / f, m.m14 / f,
                    m.m21 / f, m.m22 / f, m.m23 / f, m.m24 / f,
                    m.m31 / f, m.m32 / f, m.m33 / f, m.m34 / f,
                    m.m41 / f, m.m42 / f, m.m43 / f, m.m44 / f);
}

// Vergleichsoperatoren

inline bool operator == (const Matrix& a,
                         const Matrix& b)
{
    if(a.m11 != b.m11) return false;
    if(a.m12 != b.m12) return false;
    if(a.m13 != b.m13) return false;
    if(a.m14 != b.m14) return false;
    if(a.m21 != b.m21) return false;
    if(a.m22 != b.m22) return false;
    if(a.m23 != b.m23) return false;
    if(a.m24 != b.m24) return false;
    if(a.m31 != b.m31) return false;
    if(a.m32 != b.m32) return false;
    if(a.m33 != b.m33) return false;
    if(a.m34 != b.m34) return false;
    if(a.m41 != b.m41) return false;
    if(a.m42 != b.m42) return false;
    if(a.m43 != b.m43) return false;
    return a.m44 == b.m44;
}

// Vergleichsoperatoren

inline bool operator != (const Matrix& a,
                         const Matrix& b)
{
    if(a.m11 != b.m11) return true;
    if(a.m12 != b.m12) return true;
    if(a.m13 != b.m13) return true;
    if(a.m14 != b.m14) return true;
    if(a.m21 != b.m21) return true;
    if(a.m22 != b.m22) return true;
    if(a.m23 != b.m23) return true;
    if(a.m24 != b.m24) return true;
    if(a.m31 != b.m31) return true;
    if(a.m32 != b.m32) return true;
    if(a.m33 != b.m33) return true;
    if(a.m34 != b.m34) return true;
    if(a.m41 != b.m41) return true;
    if(a.m42 != b.m42) return true;
    if(a.m43 != b.m43) return true;
    return a.m44 != b.m44;
}

// ******************************************************************

// Funktionen deklarieren

inline      Matrix  MatrixIdentity() {return Matrix(1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f);}   // Identitätsmatrix liefern

Matrix  MatrixTranslation(const Vector3& v);                                                                                                // Translationsmatrix (Verschiebungsmatrix) berechnen

Matrix  MatrixRotationX(const float f);                                                                                                     // Rotationsmatrix um die X-Achse berechnen

Matrix  MatrixRotationY(const float f);                                                                                                     // Rotationsmatrix um die Y-Achse berechnen

Matrix  MatrixRotationZ(const float f);                                                                                                     // Rotationsmatrix um die Z-Achse berechnen

Matrix  MatrixRotation(const float x, const float y, const float z);                                                                            // Rotiert um alle drei Achsen

Matrix  MatrixRotation(const Vector3& v);                                                                                                   // Rotiert um alle drei Achsen

Matrix  MatrixRotationAxis(const Vector3& v, const float f);                                                                                // Rotationsmatrix um eine beliebige Achse berechnen

Matrix  MatrixScaling(const Vector3& v);                                                                                                    // Skalierungsmatrix berechnen

Matrix  MatrixAxes(const Vector3& vXAxis, const Vector3& vYAxis, const Vector3& vZAxis);                                                // Liefert eine Achsenmatrix

float   MatrixDet(const Matrix& m, float* pfOut);                                                                                           // Determinante berechnen

Matrix  MatrixInvert(const Matrix& m);                                                                                                      // Invertierte (umgekehrte) Matrix berechnen

Matrix  MatrixTranspose(const Matrix& m);                                                                                                   // Transponierte Matrix berechnen

Matrix  MatrixProjection(const float fFOV, const float fAspect, const float fNearPlane, const float fFarPlane);                             // Projektionsmatrix berechnen

Matrix  MatrixCamera(const Vector3& vPos, const Vector3& vLookAt, const Vector3& vUp = Vector3(0.0f, 1.0f, 0.0f));                  // Kameramatrix erzeugen

Matrix  MatrixToTex2DMatrix(const Matrix& m);                                                                                               // In Texturmatrix umwandeln


// ******************************************************************


wozu dient eigentlich?

C-/C++-Quelltext

1
2
3
4
// Verwendete Symbole vordefinieren

class Vector2;
class Vector3;
Matrix MatrixInvert(const Matrix& m);


mfg
epsilon2[/code]

DrthM2001

Alter Hase

Beiträge: 721

Wohnort: Karlsruhe

  • Private Nachricht senden

7

28.05.2005, 23:45

ich würde mal sagen das sind ganz normale prototypen?

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

8

29.05.2005, 00:00

das dient dazu, um Symbole vorzudefinieren.

Du kennst ja sicherlich Prototypen für Funktionen das ganze gibt es auch für Variablen. Manchmal muss man Variblen vordefinieren um die z.B. in anderen Dateien (include Dateien) benutzen zu können.

Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//------------------------------

// MAIN.H

//-----------------------------

struct SObject;

#include "test.h"

struct SObject
{
    unsigned ID;
    float* fSpace;
}

SObject TestObjectInMainIncludeFile;

//------------------------------

// TEST.H

//-----------------------------


SObject TestObjectInTestIncludeFile;



MAIN.h ist ine Datei, TEST.h ebenfalls.
Durch diese Vordefinitionen ist es mgl. Die Struktur SObject auch im TEST.H zu verwenden, ohne das die überhaupt deklariert wurde. Man kann also dadurch DEKLARATION und DEFINITION trennen :)

Anonymous

unregistriert

9

29.05.2005, 00:07

@koschka danke für die erklärung

ich hab mein lnk 2019 gelöst :huhu:
es war eine vergessene datei.


ich hatte schlichtweg übersehen, dass es nicht nur eine matrix.h gibt, sondern auch eine matrix.cpp, die man tunlichst portieren sollte :ohoh:

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

10

29.05.2005, 10:41

kein Problem, dann is ja gut :)

Werbeanzeige