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

30.01.2007, 10:00

C++ Templates und DLLs (MSVC++ 6)

Hi all!

Ich habe eine Frage an euch. Ich erstelle atm ein paar Template-Klassen, die in eine DLL exportiert werden. Die Deklaration der Klassen geschieht wie gehabt in einer Header-File, die Implementation einzelner methoden allerdings in der zugehörigen cpp-File.

Die Klasse lässt sich wunderbar kompilieren, die DLL wird mit der lib file erstellt. Wenn ich allerdings in einem Test-Programm die DLL einbinden will, und eine dieser Methoden der Klasse die in der cpp-file implementiert sind, aufrufen will, spinnt mein linker (Cannot resolve external).

Nun, im prinzip ist der fehler klar. Dadurch dass das eine Template-Klasse ist, kennt er den Typ nicht innerhalb der DLL. Er müsste zur Compilezeit den Code ersetzen, was ihm nicht gelingt da die implementation in der DLL steht.

Nun, die einzige Möglichkeit bisher ist, die implementation auch in der Header-File vorzunehmen ohne zugehörige cpp. Ich wollte nur fragen, kennt ihr eine andere Möglichkeit mit Templates, DLLs und Modularisierung in MSVC++ 6 zu arbeiten?

mfg Prophecy

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

2

30.01.2007, 10:07

Ich hab wenig Ahnung von Templates aber ich weiss das die Implementierung im VS6 zu Teilen fehlerhaft sein soll. Ob das bei dir nun auch der Fall ist kann ich dir nicht sagen, aber ich würde mir überlegen aufs VS8 Express umzusteigen. Wenn du anfängst um die Eigenarten des VS6 rumzubiegen kommt am Ende wahrscheinlich nix gutes bei rum ...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

30.01.2007, 10:12

Du hast den Fehler ja schon erkannt. Bei Templates muss sowohl Deklaration als auch Definition für die selbe Compiliereinheit sichtbar sein. D.h. du hast drei Möglichkeiten:

:arrow: Du schreibst Deklaration und Definition in den Header
:arrow: Du deklarierst das Template im Header und includierst direkt darunter die Datei mit der Template Definition
:arrow: Du verwendest export um das Template zu exportieren.

Zu drittem Ansatz ist zu sagen das es bis heute kaum Compiler gibt die dieses C++ Feature unterstützen, also ist das meist hinfällig (für VS6 Benutzer sowiso). Bleiben also zwei Möglichkeiten.

Bei dir kommt noch hinzu das du den Code in die Dll exportieren willst. Wie du aber bereits erkannt hast funktioniert das nicht, da Templates zur kompilierzeit neuen Code erzeugen und du keinen Template Code in Dlls ablegen kannst.

Was du also tun kannst ist einfach alle Templates vollständig im Header zu implementieren und mit deinen Bibliotheksheader mitzuliefern.
@D13_Dreinig

4

30.01.2007, 11:11

Danke für eure antworten!

Somit bleibt mir nichts anderes übrig als die Templates mit den Headern mitzuliefern. Ist aber auch ok so.

@Gurke:
Bei Gelegenheit werde ich mir mal das VS8 Express mal anschauen. Ich benutze es schon seit ewigkeiten, wird sicherlich schwierig gewohnheiten abzulegen :D

Werbeanzeige