Zum Inhalt springen

Eigene Header so einfach wie die Mitgelieferten aufrufen.


Empfohlene Beiträge

Geschrieben

Hallo an alle,

diesmal hab ich ein kleineres Problem. Ich will meine Header und Cpp Dateien,

die ich öfters brauche, in den Includeordner meiner Entwicklungsumgebung

packen.

So weit, so gut. Mein Problem ist nur, dass wenn ich den Header eintrage

und die Funktion aufrufen will, er mir diese als kleine Syntax-Vorschau

anzeigt, doch dann rummeckert: "undefined reference to ...."

Gut das Problem ist auch schnell gelöst indem ich in Code::Blocks bei

"Project->Add Files" die Dateien zu meinen aktuellen Projekt hinzufüge.

Nur das wird doch sehr nervig, umso mehr Dateien es werden. Was mir

auch auffällt ist, dass in dem Include Ordner von C::B nur Headerdateien

sind.

Woher bzw. wie wissen die Header wo ihre Cpp Dateien liegen?

Also mein Problem ist, dass ich meine eigenen Header genauso einfach

einbinden möchte wie man es z.B. mit der math oder iostream machen kann.

Einmal mit include eingebunden und man kann alle Funktionen nutzen. Ich will

dafür nicht extra in jedem Projekt wo ich die Dateien brauche "Project->Add

Files" aufrufen und jede Header und Cpp Datei manuell hinzufügen.

Danke schonmal für eure Hilfe.

Mr. Miyagi

Geschrieben
Woher bzw. wie wissen die Header wo ihre Cpp Dateien liegen?
Gar nicht.

Also mein Problem ist, dass ich meine eigenen Header genauso einfach

einbinden möchte wie man es z.B. mit der math oder iostream machen kann.

Viele Entwicklungsumgebungen linken solche Standardbibliotheken einfach automatisch dazu. Darum hat es den Anschein, dass der Header allein ausreicht.
Geschrieben

So klein ist das Problem nicht. Der erste Punkt ist es, den Unterschied zwischen Deklaration und Implementierung zu kennen. vereinfacht ausgedrückt: Deklaration heißt anzugeben, was man macht, Implementierung heißt wie man es macht. Die Deklaration erfolgt in den header-Dateien, und die Implementierung in den cpp- Dateien. Eine Klassen-Deklaration beginnt mit "Class Name : Mutterklasse { Die Implementierung beginnt meist mit der Festlegung des Konstruktors "Name ::Name() " . Bei der Erstellung wird die cpp-Datei aufgerufen, wobei die #include- Direktiven die zu Beginn definierten header-Dateien lädt, die die Deklarationen enthalten. Der dazugehörige Quellcode kann in cpp-Datei stehen oder die Funktionen vorcompiliert in dll oder lib- Dateien. Wie man die erstellt und einbindet, kann ich so nicht sagen. Da muß die Hilfe aufgerufen werden.

LG Andre'

Geschrieben

Wie mache ich das dann mit meinen eigenen Headern? Ich will ja möglichst nur

den Header deklarieren und dann gleich loslegen. Also ein Rundum-sorglos-Paket. :D

Muss ich dafür eine eigene Bibliothek erstellen die in den lib Ordner kommt?!

Wenn ja, woher weiß dann der Header wo diese ist ?! Irgendwie müssen ja

die Header wissen woher sie ihre Daten bekommen.

Geschrieben
Wie mache ich das dann mit meinen eigenen Headern? Ich will ja möglichst nur

den Header deklarieren und dann gleich loslegen. Also ein Rundum-sorglos-Paket. :D

Das geht leider nur, wenn im Header auch die Implementation liegt, d.h. wenn nur Inline-Funktionen oder Templates im Header stehen. Das soll übrigens keinesfalls eine Aufforderung sein, das zu tun ;)

Muss ich dafür eine eigene Bibliothek erstellen die in den lib Ordner kommt?!
Das wäre eine Möglichkeit.

Wenn ja, woher weiß dann der Header wo diese ist ?! Irgendwie müssen ja

die Header wissen woher sie ihre Daten bekommen.

Nein, wie ich schon sagte, die Header wissen gar nichts.

In deinem anderem Thread hattest du doch ein SDL-Projekt. Da reichte es auch nicht, die SDL-Header einzubinden. Du musstest dem Linker über "-lSDLMain -lSDL -lSDL_image" anweisen, die zugehörigen Bibliotheken zu linken. Genauso würdest du das dann mit einer eigenen Bibliothek machen.

Geschrieben

Theoretisch könnte man die libs auch gleich in der Header einbinden, find ich aber ehrlich gesagt unschön.

Das einfachste wär bestimmt eine dll (dynamisch oder statisch) in den jeweiligen Dateien zu laden (hierbei dann einfach mit Relativpfaden arbeiten...).

Ich kenn bei VS Studio auch noch eine andere Möglichkeit, evtl. geht die ja bei Codeblocks auch:

Im Projektexplorer stehen Sachen wie Include-Verzeichnis und Bibliotheksverzeichnis drin, sicher könnte man da auch einfach seinen speziellen Pfad zum (eigenentwickelten) Framework mit einbringen.

Geschrieben (bearbeitet)

Hab mal im C::B Porjektordner geschaut und da legt er ja einen Ordner mit dem Namen Obj an.

Dort sind dann *.o Dateien, welche ja compilierte Cpp Dateien sind. Da ich die selbe Dateiendung auch schon im lib Verzeichnis von C::B gesehen habe, dachte ich mir, dann kann ich ja einfach meinen Header in den Include Ordner packen und meine *.o Datei in den lib Ordner. Dann müsste ich ja nur noch im Linker die *o.Datei angeben und fertig. Es funktionierte aber wieder nicht. Es kam nur wieder der Fehler:

Das einfachste wär bestimmt eine dll (dynamisch oder statisch) in den jeweiligen Dateien zu laden (hierbei dann einfach mit Relativpfaden arbeiten...).

Von dll Dateien habe ich absolut keine Ahnung. Hab mich da mal ein wenig eingelesen und würde auf anhieb entscheiden, wenn ich es denn so mache, eine statische dll zu erstellen. Erscheint mir persönlich einfacher. Also hab ich versucht in C::B ein neues dll Projekt zu erstellen. Da ist aber eine Menge Code den ich nicht verstehe. Wäre also nett wenn mir mal jemand den Code unten genauer erklären kann.

Erstmal der Header der automatisch erzeugt wird.

#ifndef __MAIN_H__

#define __MAIN_H__


#include <windows.h>


/*  To use this exported function of dll, include this header

 *  in your project.

 */


#ifdef BUILD_DLL

    #define DLL_EXPORT __declspec(dllexport)

#else

    #define DLL_EXPORT __declspec(dllimport)

#endif



#ifdef __cplusplus

extern "C"

{

#endif


void DLL_EXPORT SomeFunction(const LPCSTR sometext);


#ifdef __cplusplus

}

#endif


#endif // __MAIN_H__
Hier die Main.cpp die automatisch erzeugt wird.
#include "main.h"


// a sample exported function

void DLL_EXPORT SomeFunction(const LPCSTR sometext)

{

    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);

}


BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)

{

    switch (fdwReason)

    {

        case DLL_PROCESS_ATTACH:

            // attach to process

            // return FALSE to fail DLL load

            break;


        case DLL_PROCESS_DETACH:

            // detach from process

            break;


        case DLL_THREAD_ATTACH:

            // attach to thread

            break;


        case DLL_THREAD_DETACH:

            // detach from thread

            break;

    }

    return TRUE; // succesful

}

Was mir schon mal gar nicht gefällt ist, dass in dem Code viel zu oft Windows

auftaucht. Deswegen wollte ich auch wissen ob man (außer in dem Beispiel) Windows weglassen kann. Wenn nicht:

Gibt es eine Alternative zu den dll's die plattformunabhängig ist ?

Noch ein Problem: Wenn ich auf Compilieren gehe kommt eine Fehlermeldung die sagt: "You must select a host application to run a libary ..."

Geht man auf "Project->Set Programs' Arguments" kann man die host application auswählen, aber wozu braucht das Projekt eine *.exe um meine dll zu erstellen?

Wenn ich dann dort eine beliebige *exe hinzufüge kommt aber wieder ein Fehler der dann sagt: "Execution of '"Test.exe" ' in 'C:\... DLLTest' failed."

Übrigens habe ich dann im bin Verzeichnis trotz den Fehlermeldungen die Test dll zu stehen.

Meine Fragen zusammen gefasst.

Wie erstelle ich eine dll Datei und worauf muss man achten?

Ist eine dll plattformunabhängig benutzbar?

So das ist dann wieder eine kleine Geschichte hier, aber dafür beschreibt es mein Problem ausführlich. ^^

mfg Mr. Miyagi

Bearbeitet von Mr. Miyagi

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...