Hallo alle zusammen,
also erstmal vorweg, ich bin neu hier im Forum also drückt bitte eure beiden Augen ganz fest zu wenn das hier das falsche Forum o.ä. ist
.
Ausserdem solltest du wissen, dass ich die Angewohnheit besitze, sehr lang und ausführlich zu schreiben (dass soll dich aber nicht davon abhalten, das hier zu lesen
).
Also jetzt zu meinem Problem:
Ich lese grade (zum zweiten mal) David Scherfgen's Buch über die 3D-Spiele Entwicklung mit DirectX9 (das erste mal war ich hoffnungslos überfordert und von dem Code erschlagen, da ich mich zu dem Zeitpunkt noch nicht so gut auskannte mit C++), bin nun mit Kapitel 2 fertig (das über Vektoren, Matrizen, Ebenen etc.), und habe halt vor mir neben bei beim Lesen eine eigene kleine 3D-Engine (nichts Besonderes, der Lerneffekt steht vor Performance und Funktionsumfang) zu schrieben. Gesagt, getan, also hab ich (da mit Kapitel 2 fertig) nun Klassen für Vektoren Matrizen und dem ganzen Kram, nur leider habe ich Trottel den Fehler Nummer 1 begangen und habe zwischendurch nie getestet (nur immer mal kompiliert um zu sehen, ob syntaktische Fehler o.ä. drin sind), und als ich nun mit dem Coden fertig war, habe ich mir ein (aufgrund der neu hinzugekommenen Codemenge) relativ großes Testprogramm geschrieben, welches so ziemlich alles was ich geschrieben habe testen sollte. Bis zum Konsolenfenster bin ich aber ganricht gekommen, denn ich wurde vom Linkerfehler schlecht hin aufgehalten (LNK2019: Verweis auf nicht aufgelöstes externes Symbol "Dings" in Funktion "Bums").
So weit so gut, es fehlen also die Funktionen à la "MatrixCamera", "MatrixProjection" etc. in der Bibliothek. Das Problem ist jetzt, dass ich keine Ahnung habe, warum. Für die Funktionen/Klassen/etc. habe ich mir halt das Standard-Makro geschrieben, wei man es kennt:
|
C-/C++-Quelltext
|
1
2
3
4
5
|
#ifdef ENGINE_EXPORTS
#define R_API __declspec(dllexport)
#else
#define R_API __declspec(dllimport)
#endif
|
Diese Makro ist auch überall dort wo es hin soll (auch bei den Funktionen, die dann nach dem Kompilieren fehlen). Nur um sicher zu gehen, dass es auch genau an der richtigen Stelle ist (das ist nämlich so ziemlich das erste mal, dass ich eine DLL schreibe): Ich bin immer nach folgendem Muster vorgegangen (natürlich nur bei den Deklarationen in den Header-Dateien):
Bei Funktionen zB:
|
C-/C++-Quelltext
|
1
|
inline R_API float Foo(...);
|
Bei Klassen zB:
|
C-/C++-Quelltext
|
1
|
class R_API Bar {...};
|
(Den ganzen Quelltext hier zu Posten wäre vllt. etwas zu groß, könnte ich aber machen.
)
Die Kompilierte .dll-Datei habe ich mir mit dem DLL Export Viewer (
http://www.nirsoft.net/utils/dll_export_viewer.html) unter die Lupe genommen, und Festgestellt, dass diese fehlenden Funktionen tatsächlich garnicht erst exportiert wurden.
Nun zu dem Punkt, der für mich am unerklärlichsten ist: Es fehlen nicht ALLE Funktionen (Klassen sind sowieso nicht betroffen), denn 4 Funktionen haben es trotz diesen mysteriösen Umständen durch Zauberhand in die DLL geschafft. Sie stammen alle aus einer Datei (sind also nicht "rein" zufällig verteilt) und sind auch die Funktionen, die als erstes in der Datei stehen (Die betroffene Datei, übrigens die "Vektor-Datei" beinhaltet eine Klasse und 8 Funktionen). Also um das nochmal zu verdeutlichen:
Datei Vector3D.h:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
class R_API Vector3D // Ist sowieso vorhanden
{
[...]
}
inline R_API VectorCross(const rVector3D& a, const rVector3D& b); // Ist vorhanden
inline R_API float VectorDot(const Vector3D& a, const Vector3D& b); // Ist vorhanden
inline R_API float VectorAngle(const Vector3D& a, const Vector3D& b); // Ist vorhanden
inline R_API Vector3D Vector3DRandom(); // Ist vorhanden
inline R_API Vector3D VectorMin(const Vector3D& a, const Vector3D& b); // Fehlt
inline R_API Vector3D VectorMax(const Vector3D& a, const Vector3D& b); // Fehlt
inline R_API Vector3D VectorInterpolate(const Vector3D& a, const Vector3D& b, float s); // Fehlt
inline R_API Vector3D VectorInterpolateNormal(const Vector3D& a, const Vector3D& b, float s); // Fehlt
|
Wie man hier schon sehen kann, ist die Deklarationsform bei allen Funktionen EXAKT die selbe, und trotzdem scheint der Compiler sich nur die ersten vier herrauszusuchen (PS: Ich nutze Visual Studio 2010).
Also nochmal kurz auszuschließende Fehlerquellen:
- Die .lib zur dll ist im Testprojekt nicht gelinkt (hab ich mindestens 5 mal nachgesehen)
- Falsche Include/Bibliotheksverzeichnisse falsch angegeben (Include funktioniert ja, es wird ja kompiliert, Linker meckert nicht darüber, dass er eine .lib nicht öffnen kann)
- Falsche Syntax o.ä. (siehe oben)
- .lib/.dll der Engine nicht aktuell (Ich hab gefühlte 100.000 mal neu erstellt, mit den buntesten Combos an Linker/Compilereinstellungen, die man sich nur vorstellen kann...)
Wahlscheinlich ist es wieder ein unglaublich stupider Fehler, der jedem ausser mir innerhalb von 30 Sekunden auffallen würde (geht mir oft so :pinch
.
Naja ansonsten würde ich mich riesig freuen wenn mir jemand bei diesem Dilemma helfen könnte, weil ich stehe kurz vor einem Nervenzusammenbruch
.
Mit freundlichen Grüßen
Max
NACHTRAG: Also das ich finde es sehr amüsant dass das Wort "n ä
h m l i c h" (man achte auf die Schreibweise) in diesem Forum Zensiert ist.