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

Atze12321

Frischling

  • »Atze12321« ist der Autor dieses Themas

Beiträge: 15

Wohnort: Jena

Beruf: Schüler...

  • Private Nachricht senden

1

29.10.2012, 21:29

[C++] Fehlende Funktionen in DLL

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 :rolleyes: .
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 :wacko:.

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. :thumbsup:
8)

2

29.10.2012, 21:36

Bist du sicher das ENGINE_EXPORTS im Präprozessor definiert ist? Du könntest es in den Projekteinstellungen definieren oder in jeder Source-Datei ganz am Anfang das machen: #define ENGINE_EXPORTS

Atze12321

Frischling

  • »Atze12321« ist der Autor dieses Themas

Beiträge: 15

Wohnort: Jena

Beruf: Schüler...

  • Private Nachricht senden

3

29.10.2012, 21:42

Ja 100% sicher, es ist in den Projekteinstellungen definiert, habe gerade nochmal nachgesehen.
8)

4

29.10.2012, 21:49

Klingt sehr unwahrscheinlich, aber eventuell liegt es an deinem Compiler. Versuch es mal mit einem anderen bzw. installiere es neu.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

29.10.2012, 21:59

Macht das inline weg. inline und dllexport machen zusammen keinen Sinn... ;)

Atze12321

Frischling

  • »Atze12321« ist der Autor dieses Themas

Beiträge: 15

Wohnort: Jena

Beruf: Schüler...

  • Private Nachricht senden

6

29.10.2012, 22:18

@dot

War das jetzt die wahrscheinliche Lösung meines Problems oder nur ein Tipp? :)

@delop

Ich werde es wahscheinlich mal mit Dev C++ probieren, das benutzt doch meines wissen gcc oder?
8)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

29.10.2012, 22:20

Das war die wahrscheinliche Lösung für dein Problem. inline und dllexport zusammen macht keinen Sinn und funktioniert laut MSDN auch nur ausnahmsweise auf Memberfunktionen, die implizit inline da in der Klassendefinition definiert sind...

8

29.10.2012, 22:23

Ja, Dev C++ ist relativ alt, aber zum Kompilieren reicht es. (Obwohl wahrscheinlich eine alte Version vom Compiler drauf ist).

Aber hör auf dot...der hat immer recht.

Atze12321

Frischling

  • »Atze12321« ist der Autor dieses Themas

Beiträge: 15

Wohnort: Jena

Beruf: Schüler...

  • Private Nachricht senden

9

29.10.2012, 22:34

Also das mit dem inline hat schonmal nicht funktioniert, schade :(, werde bald mal mit einem anderen compiler probieren
8)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

10

29.10.2012, 22:38

Was genau hat nicht funktioniert? Der Compiler ist hier ganz sicher nicht das Problem... ;)

Werbeanzeige