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
http://www.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):
|
C/C++ Quellcode
|
1
2
3
4
5
6
|
#if defined(_MSC_VER)
#include "Bogenschuetzen.hpp"
#define DLL extern "C" __declspec(dllexport)
#else
#define DLL
#endif
|
In den Cpp-Dateien lasst du einfach die dazugehörige H-Datei einbindung:
|
C/C++ Quellcode
|
1
|
#include "Bogenschuetzen.hpp"
|
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.
|
C/C++ Quellcode
|
1
2
3
4
5
6
|
#ifndef _BOGENSCHUETZEN_HPP_
#define _BOGENSCHUETZEN_HPP_
// Code Der HPP Datei
#endif // _BOGENSCHUETZEN_HPP_
|
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:
|
C/C++ Quellcode
|
1
2
3
4
5
6
7
8
9
10
|
#ifndef _DLLMAIN_HPP_ // Start des
#define _DLLMAIN_HPP_ // Include-Waechter
#if _USRDLL // Wird die Biblitohek exportiert oder importiert
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
#endif // _DLLMAIN_HPP_ (Ende des Include-Waechters)
|
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:
|
C/C++ Quellcode
|
1
2
3
4
5
6
|
#ifndef _BOGENSCHUETZEN_HPP_
#define _BOGENSCHUETZEN_HPP_
#include "dllmain.h"
...
|
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:
|
C/C++ Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
|
// Fuer Klassen
class DLL_API Ctest
{
public:
Ctest(void);
};
// Fuer Variablen
extern DLL_API int ntest;
// Fuer Funktionen
DLL_API int fntest(void);
|
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 Rushh0ur