[GELÖST] C++ - Template aus DLL exportieren?

Übersicht Sonstiges Smalltalk

Neue Antwort erstellen

 

CO2

ehemals "SirMO"

Betreff: [GELÖST] C++ - Template aus DLL exportieren?

BeitragMi, Apr 06, 2016 17:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,

ich schon wieder... Embarassed

Ich habe folgendes Problem: Ich schreibe momentan ein Anwendung mit Visual C++ wie Studio Community 2015, welche auf einer EXE und einer DLL basiert. Beide Anwendungsteile werden von mir entwickelt. Da ich noch am Probieren bin, ist auch der Aufbau dieser beiden Teile relativ simpel: In meiner DLL habe ich eine Templateklasse, die ein TypedPointerArray darstellt. Diese Klasse wird innerhalb der DLL noch nicht konkretisiert, es wird also noch kein konkretes Objekt dieser Klasse angelegt. Die Klasse wird außerdem korrekter Weise mit __declspec(dllexport) aus der DLL exportiert. In meiner Solution habe ich festgelegt, dass die EXE das Startprojekt und abhängig von der DLL ist. Außerdem habe ich die DLL als Verweis in das EXE-Projekt "gelegt". So weit, so gut. Nun möchte ich in der main()-Funktion, welche in der EXE liegt ein konkretes Objekt der importierten Klasse aus der DLL erzeugen. Allerdings wirft mir der Linker beim Kompilieren Fehler und sagt, er kenne die Klasse nicht. Wenn ich nach diesem Problem google ist eine der ersten Lösungen immer, dass ich eine LIB anstatt einer DLL kompilieren sollte, was nicht Sinn der Übung ist, denn es muss ja auch noch anders gehen. Auch ist die Lösung, die Template-Klasse einfach in die EXE zu kopieren, nicht zufriedenstellend.

Hier noch ein unprofessionelles Schaubild des Solution-Aufbaus:
Code: [AUSKLAPPEN]
Solution
   - Projekt 1 (DLL)
      - Templateklasse.h   (enthält die Klasse "template<class T> class __declspec(dllexport) MyPA : CTypedPtrArray<CPtrArray, T>"
   - Projekt 2 (EXE)
      - main.cpp (inkludiert Templateklasse.h aus der DLL und erstellt ein konkretes Objekt)


Ich hoffe ihr könnt mir helfen.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti
  • Zuletzt bearbeitet von CO2 am Fr, Apr 08, 2016 21:02, insgesamt einmal bearbeitet

Thunder

BeitragDo, Apr 07, 2016 8:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Ein Template ist eine Vorlage für den Compiler, nach der er Code generiert. Wenn du das Template im DLL Code nicht verwendest, wird es auch nicht kompiliert. Also wenn in der DLL nur die Templateklasse ist, hast du dir eine leere DLL kompiliert Very Happy

Wenn du das Template anderen Source Files bereitstellen möchtest, musst du es in ein Header File tun (edit: die ganze implementierung der Klasse!) und includen. Templates sind was statisches (sie werden ja zu compilezeit spezialisiert), d.h. in DLL exportieren oder so geht nicht.

Du brauchst dir keine Sorgen machen, dass das zu groß wird oder so, weil der Compiler selber nur die Datentypen des Templates instanziert, die du brauchst und der Linker sorgt dafür, dass jede Methode nur einmal in der fertigen executable vorkommt.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

CO2

ehemals "SirMO"

BeitragFr, Apr 08, 2016 21:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Jep, das war die Lösung:

In die automatisch generierte DllMain() einfach eine konkrete Instanz der Template-Klasse anlegen und fertig. Manchmal ist C++ auch logisch Very Happy

Vielen Dank.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Thunder

BeitragFr, Apr 08, 2016 22:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich verstehe nicht, wieso du den Code unbedingt in der DLL haben willst, wenn er dort anscheinend gar nicht gebraucht wird...
Eine Templateklasse ist deswegen eine Templateklasse, weil sie vom Compiler mit den Typen instanziert wird, mit denen sie gebraucht wird.

Wenn du sie nur mit einem Typ instanzierst, kannst du das Templaten auch sein lassen, denn Templates parsen erhöht die Compilierzeit enorm.
Dein Unterfangen ist so, als würde man in Java eine unendlich große Klassenhierarchie aufbauen, davon aber nur eine Klasse verwenden, und alles nur damit der Compiler mehr zu tun hat....
Ich gebe zu, ich weiß nichts darüber, was du machst, aber es klingt komisch.. Confused
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit
 

CO2

ehemals "SirMO"

BeitragSa, Apr 09, 2016 14:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Grund ist, dass das mehr als zwei Programmteile werden, es kommen also noch welche hinzu. Um das Template nicht in jedes Projekt kopieren zu müssen lagere ich es in die Basis-DLL aus, auf die jedes Projekt zugreifen kann. Ich dachte, das sei der sinnvollste Weg, zumal es sich um eine wichtige Grundklasse handelt, da sie eine Liste darstellt.
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

DAK

BeitragSa, Apr 09, 2016 14:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst ja auch einfach den Header in jedes Projekt einbinden.
Gewinner der 6. und der 68. BlitzCodeCompo
 

CO2

ehemals "SirMO"

BeitragSa, Apr 09, 2016 14:57
Antworten mit Zitat
Benutzer-Profile anzeigen
So der Plan, muss es aber in ein Projekt legen (Hier das der Basisbibliothek), um den Header in anderen Projekten einbinden zu können - oder übersehe ich irgendetwas?
mfG, CO²

Sprachen: BlitzMax, C, C++, C#, Java
Hardware: Windows 7 Ultimate 64-Bit, AMX FX-6350 (6x3,9 GHz), 32 GB RAM, Nvidia GeForce GTX 750 Ti

Thunder

BeitragSo, Apr 10, 2016 23:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich probiere es mit einem Beispiel. Angenommen ich schreibe eine LinkedList-Klasse und der Typ den sie aufnehmen kann ist ein Template, dann kann ich die Klasse als LinkedList<int> oder LinkedList<std::string> oder LinkedList<std::chrono::milliseconds> ... einsetzen. Der Compiler generiert den zugehörigen Code.

Wenn ich die Implementierung der Klasse in eine DLL tue und sie innerhalb der DLL als LinkedList<int> instanziere, kann mein ganzer Anwendungscode (Code außerhalb der DLL) die LinkedList nur als LinkedList<int> nutzen, was den Sinn des Templates ruiniert.
Außerdem werden so alle Funktionen auf jeden Fall in eine DLL geschrieben, auch wenn sie nicht gebraucht werden.

Ich habe glaube ich schon zweimal gesagt, dass Templateklassen/-funktionen samt ihrer Implementierung normalerweise in ein Headerfile kommen, weil sie sowieso nur dann kompiliert werden, wenn sie auch benutzt werden, und weil sie so für jeden Datentyp einzeln kompiliert werden, mit dem sie instanziert werden.

Ich verstehe, dass es Gründe geben kann, wieso man die Klasse trotzdem in eine DLL auslagern will, aber ich wollte
es trotzdem erwähnen.
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit

DAK

BeitragMo, Apr 11, 2016 14:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, wenn man Klassen in einer DLL haben will, dann braucht man keine Templates machen.
Gewinner der 6. und der 68. BlitzCodeCompo

Neue Antwort erstellen


Übersicht Sonstiges Smalltalk

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group