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

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

1

06.03.2006, 16:07

Unnachvollziehbarer Linker-Fehler

Hi!

Habe gerade meine ganze Engine auf UniCode umgestellt! Nun bin ich dabei, auch die Apps, welche auf meiner Engine basieren anzupassen, und da stoß ich gerade auf einen für mich unerklärlichen Fehler!

Quellcode

1
2
3
4
5
ModelConverter error LNK2019: Nicht aufgelöstes externes Symbol '"__declspec(dllimport) public: enum ogResult __thiscall ogMemory<struct og3dsVertexNormal>::MemFree(void)" (__imp_?MemFree@?$ogMemory@Uog3dsVertexNormal@@@@QAE?AW4ogResult@@XZ)', verwiesen in Funktion '"enum ogResult __cdecl ExitApp(void)" (?ExitApp@@YA?AW4ogResult@@XZ)'

ModelConverter error LNK2019: Nicht aufgelöstes externes Symbol '"__declspec(dllimport) public: enum ogResult __thiscall ogMemory<unsigned short>::MemFree(void)" (__imp_?MemFree@?$ogMemory@G@@QAE?AW4ogResult@@XZ)', verwiesen in Funktion '"enum ogResult __cdecl ExitApp(void)" (?ExitApp@@YA?AW4ogResult@@XZ)'

ModelConverter fatal error LNK1120: 2 unaufgelöste externe Verweise


Und das sind die Verweise die das auslösen:

C-/C++-Quelltext

1
2
g_MemIndex16.MemFree();
g_MemVertex.MemFree();


Das komische daran ist aber, dass ich die selbe Funktion noch andere male aufrufe, und diese KEINEN Fehler ausspucken:

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
ogResult ExitApp()
{
    //Ausgabe

    wprintf(L"Der OGM-Konverter wird heruntergefahren...\n");

    //Speicher freigeben

    for(int i = 0; i < iModelCount; i++) OG_SAFE_DELETE_ARRAY(g_Effect.Effects[i].aPasses);
    OG_SAFE_DELETE_ARRAY(g_Effect.Effects);
    g_MemIndex16.MemFree();
    g_MemIndex.MemFree();
    g_MemLight.MemFree();
    g_MemMaterial.MemFree();
    g_MemVertex.MemFree();

    //Alles herunterfahren

    g_3ds.Exit();
    ogExit();

    //Abgeschlossen

    wprintf(L"Das Programm wurde erfolgreich heruntergefahren\n");

    exit(0);
    return OG_OK;
}


Hat da jemand eine Ahnung was das sein könnte?
Braucht ihr mehr Code? Wenn ja, welchen?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

2

06.03.2006, 18:16

Du benutzt eine Funktion, die du nicht mit "__declspec(dllexport) gekennzeichnet hast, außerhalb deiner DLL..
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

3

06.03.2006, 18:20

Wieso funktionierts dann bei der selben Klasse 3 von 5 mal? Nur weil ein anderer Templatetyp definiert wurde? MemFree ist eine ganz normale Memberfunktion so wie MemAlloc oder MemReAlloc auch, und da mault er auch nicht... :( HILFE! BITTE!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

4

07.03.2006, 13:11

Kann mir wirklich niemand helfen??? Ich bin echt am verzweifeln! Und vor allem!! Was hat das mit UNICODE zu tun!?!?!?!? Ich habe die ogMemory-Klasse ja nicht verändert!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

5

08.03.2006, 18:31

So, ich hab jetzt lange Zeit herumprobiert. Nun bin ich draufgekommen, dass alle Datentypen mit welchen ich auch in der Engine eine ogMemory<T>-Instanz gemacht habe, außerhalb funktionieren, und alle anderen nicht!

Kann das damit zu tun haben, dass ich bei der Klassendeklaration dllexport(in der Engine) bzw dllimport(in der App) angegeben habe?
Ich hab schon probiert, das wegzulöschen, nur kommt dann ein Fehler beim Kompilieren der Engine (Klasse braucht eine DLL-Schnittstelle). Weiß jetzt vielleicht jemand was man machen könnte?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

6

08.03.2006, 23:45

Ähm, benutzt du die Templates IN der DLL? oder ausserhalb.

Wenn du sie intern (in der DLL Templates) nutzt, geht das ohne weiterem nicht. (Das Compilieren geht schon, aber du bekommst dann von dem Clienten der die DLL nutzt immer einen Fehler "Konnte Stack<int> nicht finden in test.dll", weil in deiner DLL dann nur sowas wie Stack<typename> drin steht. Du hast (auch explizit angegeben) nirgendwo Stack<int> definiert, und da die DLL nur in Maschienencode vorliegt kann der Linker / Compiler das auch nicht mehr erzeugen.
Ich hab mich daran auch schon totgesucht. Es hilft wenn du Stack<int> in der DLL deklarierst. Google am besten dazu aber nochmal.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

7

09.03.2006, 14:41

Hmm... Eben ist genau das das Problem. Ich will eine Template-Klasse innerhalb UND außerhalb der DLL verwenden! Was bedeuten würde, dass ich sie einerseits MIT dllimport bzw dllexport deklarieren müsste, aber andererseits ohne (damits außerhalb auch funktioniert, und nicht nur die generierten Klassen der DLL verwendbar sind...)

@nix da
Hast du vielleicht eine Ahnung (als Template-Spezialist ;) )?
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Anonymous

unregistriert

8

09.03.2006, 18:41

Black-Panther
Exportierungen von Templateklassen gehen nicht, Templates werden zur Compilierzeit aufgelöst und nicht zur Laufzeit. Daher ist das was Du versuchst unmöglich.

koschka

Community-Fossil

Beiträge: 2 862

Wohnort: Dresden

Beruf: Student

  • Private Nachricht senden

9

09.03.2006, 20:31

Naja, direkt geht es nicht, das ist richtig, aber mit einem Trick kann man sie dennoch verwenden, auch wenn das nicht der wirkliche Gedanke eines Templates ist.

Dazu nutzt du ganz einfach direkte Schablonen wie diese hier:

C-/C++-Quelltext

1
2
3
4
5
6
7
template <typename>class Stack
{
    ...
};

Stack<int>;
Stack<unsigned>;


Dadurch sind Stack<int> und unsigned mgl.
Ich habs aber jetzt nicht ausprobiert, also bitte nicht lünchen, dürfte aber klappen.

Steven77

Alter Hase

Beiträge: 515

Wohnort: Münster - Gievenbeach

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

10

10.03.2006, 18:40

Zitat von »"koschka"«

Dadurch sind Stack<int> und unsigned mgl.
Ich habs aber jetzt nicht ausprobiert, also bitte nicht lünchen, dürfte aber klappen.

Ich bin mir da nicht so sicher, dass das klappt. Du kannst dann zwar Stack-Objekte außerhalb der DLL instanzieren, jedoch ist lediglich der Standardkonstruktor kompiliert, weil templates nur soweit kompiliert werden, wie sie benötigt werden.
Wie gesagt, ganz sicher bin ich mir da nicht, weil es u.U. auch Compiler-abhängig ist. Jedoch habe ich schon sehr oft bei eigenen Codes beobachtet, dass urplötzlich ein Compiler-Fehler auftritt, den ich vorher nicht erhalten habe, erst, seit ich eine zuvor nicht benutzte Methode einer template-Klasse angesprochen habe -- die demnach auch erst dann zum ersten Mal wirklich kompiliert wurde...

Werbeanzeige