Probleme beim Einbinden eines Librarys in KDevelop Projekt (C++)
-
Hallo!
kurze Beschreibung meines Problems!
möchte ein kleines Display an meinen Parallelport anschließen - Hardware hab ich schon, jetzt fehlt noch diee Software!
hab für mein Display auf sourceforge.net ein Library gefunden. bin leider nicht sehr gut bewandelt mit C++ und brauch deshalb etwas Hilfe!mein kleines Prog sieht so aus:
#include "extdisplib.h" #include "t6963c.h" int main() { ExtDisp::ExternalDisplay *Display = new ExtDisp::T6963C; Display->Initialize(); return 0 ; }
Bein Linken tritt folgende Fehlermeldung auf:
undefined reference to 'ExtDisp::ExternalDisplay::ExternalDisplay[not in charge]()' undefined reference to 'vtable for ExtDisp::T6963C'
Die Headerdateien sehen so aus: (hab sie auf das wesentliche gekürzt)
Extdisplib.h :
#include <string> #include "extdispdefines.h" /* External Display namespace */ namespace ExtDisp { class ExternalDisplay { public: /* @note New driver classes MUST be declared as friend class of ExternalDisplay. */ friend class T6963C; friend class SED133x; ExternalDisplay(); ExternalDisplay( unsigned short width, unsigned short height, LPTPIN chipSelect, LPTPIN commandData, LPTPIN write, LPTPIN extra ); ~ExternalDisplay(); void SetDisplaySize( unsigned short width, unsigned short height ); void SetWiring( LPTPIN chipSelect, LPTPIN commandData, LPTPIN write, LPTPIN extra ); void Refresh(); virtual bool Initialize() = 0; private: ... #endif
t6963c.h :
#include <string> #include "t6963c_cmdset.h" #include "extdisplib.h" namespace ExtDisp { class T6963C : public ExternalDisplay { public: bool Initialize (); void WriteData ( unsigned char data ); void WriteCommand ( unsigned char command ); void ClearMemory (); void SetAddressPointer ( unsigned short address ); void Print ( std::string text, unsigned short x, unsigned short y, bool transparent, unsigned char font, FONTSIZE size, bool invert ); void WriteBackground ( unsigned char *pImageBuffer ); void WriteField ( unsigned char *pBuffer, unsigned short x, unsigned short y, unsigned short width, unsigned short height, bool transparent ); void WriteAdaptiveField ( unsigned char * pBufferNew, unsigned char * pBufferOld, unsigned short x, unsigned short y, unsigned short width, unsigned short height, bool transparent ); private: unsigned char maskRD; /*< mask aliases used for convenience */ }; } // namespace #endif
ich weiß ist ziemlich aufwendig!
sitz aber schon ziemlich lange dran und komm einfach nicht weiter.
ist ein kleines Schulprojekt und wäre für Hilfe sehr dankbar.<edit=kingruedi>Bitte Code in cpp-Tags einschließen. sfds
[ cpp]int i; //a[ /cpp](ohne Leerzeichen nach dem [) ergibt
int i; //a
</edit>
-
ihh - benutz bitte ma die code-tags, sonst kann man den code extrem schlecht lesen
dein comiler findet glaub ich eine funktion deiner klasse nicht, weil du sie wohl deklariert aber nicht benutzt hast (?)
mfg blan
-
du musst dir die libextdisp lib erstellt haben
und in kdevelop angeben das dein projekt mit dieser lib linken solldas geht entweder ueber den automake manager (target, rechtsklick, einstellungen, bibs, extern..., oder ueber projekteigenschaften, einstellungen configure, LDFLAGS
-
Danke schon mal für die Antworten!
Ich hab aber keine lib Datei.
nur Header Dateien!
-
Dann schlage ich vor das Projekt von Sourceforge komplett zu bauen und zu installieren...
-
Nur Headerdateien bringen dir nichts, da Headerdateien nur die Schnitstelle (API) beschreiben und (eigentlich) keinen Code enthalten. Wie soll dein Computer also wissen, was er tun soll, wenn du eine Funktion aus einem Header aufruft und kein Code vorhanden ist?
-
sorry für meine unpräzise Angaben!
natürlich sind auch zu den Header Dateien gleichnamige cpp Dateien vorhanden.aber zum vorherigen Beitrag:
ich muss also die lib die in usr/local/lib erstellt wurde zu meinem projekt hinzufügen?
und zusätzlkich die Header Datei einbinden?
-
Ja, das ist der Plan.
Zu einer Fremdbibliothek (sofern sie nicht Header-Only, z.B. eine C++-Templatebibliothek, ist) gehört immer eine Schnittstellenbeschreibung (die Header) sowie Code (meist compiliert, in Form einer .DLL, .SO, .A, .LIB, .O[BJ]) der auch das tut, was Du von der Schnittstelle erwartest. Wichtig ist am Ende nur, dass der Code, der die Bibliothek benutzt, zusammen mit dem Code läuft, der die Schnittstelle implementiert. Das passiert durch irgendeine Form des Hinzufügens der o.a. Formen (oder auch durch hinzukompilieren des fremden Quellcodes).
Meist gestaltet sich das in der Praxis so, dass die Bibliothek irgendwo in /usr/lib oder /usr/local/lib installiert ist, die Endung .so hat und dem C- oder C++-Compiler durch den Parameter -l, gefolgt von dem Namen ohne "lib" mitgegeben wird (möchtest Du also eine libextdisp.so linken, so lautet der Aufruf -lextdisp). Als ich noch kdevelop benutzt habe (ist schon eine Weile her
) musste man das im Projekt so mit -l angeben.