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

CO2ehemals "SirMO"Betreff: [GELÖST] C++ - Template aus DLL exportieren? |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo,
ich schon wieder... ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 ![]() 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 |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() 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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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.. ![]() |
||
Meine Sachen: https://bitbucket.org/chtisgit https://github.com/chtisgit |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Kannst ja auch einfach den Header in jedes Projekt einbinden. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
CO2ehemals "SirMO" |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja, wenn man Klassen in einer DLL haben will, dann braucht man keine Templates machen. | ||
Gewinner der 6. und der 68. BlitzCodeCompo |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group