Wo ist die *.lib?
-
-
Du hast absolut keine Elemente (Funktionen, Klassen oder Variablen) Angegeben zum exportieren von daher auch keine LIB.
Es wird nicht jedes Element extern verlinkbar gemacht solange man es nicht explitziet angibt.
Bevor ich verrate wie du dein LIB erhällst ein paar allgemeine Infromationen, da du den anscheinend machst wenig zu verstehen was du überhaupt machst. (Nicht böse gemeint)
Du arbeitest anscheinend mit Visual Studio, dies ist auch für den Anfang auch zu empfehlen.
Du kannst bei jedem deiner Projekte standartmässig in der Toolleiste auswählen wie du dein Projekt compilieren willst, entweder als Debug-Version oder als Release-Version:
- Die Debug-Version ist dafür da um Fehler im Programm zu suchen, dafür werden Fehlersuchinformationen in das Porjekt compiliert und die Datei wird logischerweiße größer und ist von der Entwicklungsumgebung teilweiße oder ganz abhänig, sprich man kann es unter umständen nicht auf einem anderen System ausführen. An diesem Punkt empfehle ich dir durch ein paar deiner Konsolenanwendungen mit dem debugger zu "stepen" um den Programmablauf besser zu verstehen. Schau dir am besten ein paar Debug-Tutorials an (z.B youtube.com/watch?v=z5gBIizwsY0)
- Die Relase-Version ist dafür da um schliesslich das engültige "fehlerfreie" Programm ohne zusätzliche Infromationen zu compilieren, welches auch auf anderen Systemen laufen sollte.
Desweiteren solltest du eventuel ein wenig Ahnung vom Präprozessor haben. Dieser bearbeitet alle Befehle die mit einer Raute (#) anfängt bevor der Quellcode compiliert, also bevor aus dem eigentlichen Code die verschiedenen Programme generiert werden.
- #include <dateiname> : Dieser Ausdruck wird vollständig durch den Inhalt der Datei "dateiname" ersetz, welche im Suchpfad des Compiliers liegen muss.
- #include "pfadzurhead": Dieser Ausdruck wird wird vollständig durch den Inhalt der Datei "pfadzurhead" ersetz, welche relativ zum Projektordner vorliegen muss.
- #define xyz qrs: Dieser Ausdruck definiert ein MACRO (!) names xyz. Alle darauffolgenden Text die mit dem Macronamen entsprechen werden durch qrs (muss keinen eindeutigen wert haben) ersetz. MACROs können auch dem Präprocessor direkt als Argument vordefiniert übergeben werden. In VSxx ist ein solcher vordefinierter MACRO _USRDLL, sprich mit diesem MACRO gibt der Proprocässer an das es sich um eine DLL handelt, ist diese nicht definiert wird es sich im Projekt um einen anderen Programmtyp handeln.
Solche Prärocessorederiktiven gibt es noch mehr und sind teilweiße Programmierumgebung abhängig.
Headerdateien (*.h *.hpp) und Quellcodedateien (*.c *.cpp): Was ist für was? [Hast du in deinem Quellcod soweit ich gesehen habe richtig gemacht]
In die Quellcoddateien kommen die Definitionen hinein, das ist die endgültige Funktionsweiße einer Klasse, Funktion.
In die headerdatei hingegen kommen die Deklarationen hinein, dlso nur die Struktur und nicht die eindeutige Funktionswiße.
Nun zum lösen deines Problems:
Als erstes solltest du all diese Definitionen aus den Cpp- und Hpp -Dateien entfernen (Die sind eigentlich gänzlich Falsch):
In den Cpp-Dateien lasst du einfach die dazugehörige H-Datei einbindung:
Ist dies getahn solltest du in alle deine H-Dateien wie mein Lehrer so schön sagt einen Include-Wächter einbauen und zwar auf die Art, das beugt die vor das du später in größeren Projekten mehrmals die selbe Datei einbindest und dies zu doppelten Deklerationen fürt.
Nun kommen wir zum kompileren der DLL und zum exportieren und importieren von Funktionen, Klassen und Variablen.
Um die Präprozessordirektiven für dein Projekt zu Managed empfehle ich dir eine weitere Headerdatei zu erstellen und die ganz einfach "dllmain.hpp" zu nenen die du wie follgt dann gestalltest:
Diese Datei bindest du in alle deine Headerdatein ein, in dennen du etwas exportieren willst, unzwar nach dem Start des jeweiligen Include-Wächters, in etwa so:
Nun zum exportieren und importieren musst du alle Funktionen, Klassen und Variablen die du halt exportieren willst in den Headerdateien mit dem Macro DLL_API, der in der dllmain.h Programmtyp abhängig definiert wird, versehen.
Beispiel:
Quellcode
Hast du dies getan kannst du dein Projekt als Release compilieren! Insofern mit dem Macro DLL_API versehende Elemente deklariert wurden, wird eine dazugeörige LIB-Dateie erstellt.
Nun hast du eine DLL-Datei, eine LIB-Datei und eine gut Funktionierende Headerstruktur aufgebaut.
Um nun die gewünschten Elemente in deinem externen Programm zu verwenden brauchst du nur die LIB-Datei zu linken und die schon bereits vorhandenen Heaerdateien einfach in dein zweites Projekt zu übernehmen und mittel include einbinden.
Da du nun in deinem "Exe" Programm keine DLL mehr erstellst und damit das Projekt den Präprocessor _USRDLL nicht mer vorweißt wird der MACRO DLL_API als import deklariert und alle Klassen, Funcitonen etc. die mit DLL_API versehen sind werden als import angesehen.
(Achtung wenn du eine Elemente aus einer DLL in einer DLL verwenden möchtest wird diese Art der Macrodefinition nicht zum gewünschten Ergebniss führen, da in beiden Fällen _USRDLL vordefiniert ist!)
Die verwendung der Funktionen etc. ist dann wie gewöhnlich durchzuführen.
Mfg Rushh0urDieser Beitrag wurde bereits 1 mal editiert, zuletzt von Rushh0ur ()
-
Danke, vieles ab "Nun zu deinem Problem:" habe ich noch nicht gewusst.
Eine Sache noch: "Für Klassen" muss man da die ganze Klasse noch einmal schreiben? Ist in dem Beispiel nicht ganz einsichtig.
Zweite Sache: Die *.lib wird trotz allem nicht erstellt.
Projekt²
MfG
CheckDieser Beitrag wurde bereits 2 mal editiert, zuletzt von Checkmateing ()
-
Ah das sieht doch nun viel besser aus
Nein die Klasse musst du nicht neu schreiben sondern verwendest die Dekleration in den Headerdateien.
Den programtypabhängigen MACRO hast DLL gennant, das ist auch gut, aber hier noch am rande gesagt sollte man eindeutige Macronamen verwenden!
Nun wie schon im ersten Post erwähnt musst du durch alle deine Headerdateien gehen und alle Elemente mit dem Maco, in deinem Fall DLL, versehen:
Quellcode
- #ifndef AXTKAEMPFER_HPP
- #define AXTKAEMPFER_HPP
- #include <iostream>
- #include "main.hpp"
- class DLL CAxtkaempfer // <------------ Klasse soll exportiert bzw importiert werden also diese mit dem Macro DLL versehen
- {
- private:
- int m_Live;
- int m_Attack, m_DefenseBT, m_DefenseRT;
- public:
- CAxtkaempfer();
- };
- #endif
Mfg Rushh0ur -
Achso, das bezog sich noch auf die DLL. Ich dachte da wären wir in der Executable-Datei....
Klappt perfekt!
In der *.exe funktioniert dann alles wie immer, nur wenn ich was von der DLL will, kommt dann das Makro DLL (jetzt mainDLL) hinzu?
MfG
Check -
Um die Objekte/Elemente in deiner EXE z verwenden kopierst du alle Headerdateien aus deinem DLL-Porjekt in dein EXE-Projekt.
Verlinkst die LIB-Datei und bindest die jweiligen Headerdateien die du verwenden willst in deinen Source ein in diesem kannst du dann die Objekte ganz normal verwendnen:
Mfg Rushh0ur -
Also wirklich die ganzen *.hpp-Dateien in den Ordner meiner *.exe?
Ist ja Mist. Dann kann man das doch echt fast gleich in der *.exe machen.... Ö.ö
MfG
Check -
Nun ja da bei dir der Headercode zur Zeit größer ist als dein Quellcode macht das ziemlich wenig Sinn.
BIbliotheken (DLLs) werden deswegen meisten verwendet um Mehrere zussamenhängende Funktionen in einem Modul zu verfasse nund eine Schnitsstelle bereitzustellen zum Beispiel eien DLL die für die Grafik zuständig ist ne andere zur Berechnung der Physik etc.
Mfg Rushh0ur -
Ja, das ist ja auch der Aufbau der meisten Engines.
Was ich jetzt nur noch ein bisschen lustig finde, wenn ich das tue:
wird Axtkaempfer.hpp nicht eingebunden. Die *.lib + *.dll ist im gleichem Ordner. ;]
Was ist das bitte? Ö.ô
MfG
Check -
Ist den die "Axtkaempfer.hpp" Datei auch im Suchpfad bzw. im selben Ordner?
Ich hab mal ein komplettes Beispielporjekt anhand dieses Wiki-Eintrags erstellt, sprich die Bruchklasse habe ich in eine DLL ausgelagert.
Hier die Visualstudio C++ 2008 Projektmappe zum download, solltest du ohne Probleme mit VS10 konventieren, öffnen und compilieren können. Klick.
Mfg Rushh0ur -
Okii.
Mir war nicht klar das die Header-Dateien im Ordner sein mussten.... <.<
MfG
Check -
OffTopic: Ach wie liebe ich meinen GCC
-
Das war mir jetzt fast schon klar das so etwas kommt.
Ich arbeite nur lieber mit MVC weil ich das Design gewöhnt bin.
Es wird ja auch vieles andere unterstützt, wo ich mir unsicher bin, ob es in g++ auch so ist.
MfG
Check