[gelöst] DLLs erstellen mit QT

Alles rund um die Programmierung mit Qt
DeepDiver
Beiträge: 34
Registriert: 7. November 2007 10:10
Wohnort: Fürstenfeldbruck
Kontaktdaten:

Beitrag von DeepDiver »

Hi,

Um in eine Datei zu streamen benutze ich: QTextSream http://doc.trolltech.com/4.3/qtextstream.html

Für Debug-Zwecke nimm doch einfach gDebug() - z.B.:

Code: Alles auswählen

qDebug() << "Return : " << temp;
Die Ausgabe erfolgt auf die Konsole.
Unter Windows muss ins Projektfile noch die Zeile :

Code: Alles auswählen

CONFIG += console
Viel Glück,

Tom

PS: Diese Buch kann ich nur empfehlen, da stehen alle Basics drin:
http://www.amazon.de/C-GUI-Programming- ... 399&sr=8-4

/EDIT: is natürlich qDebug und nicht gDebug - Tippfehler - sorry
Zuletzt geändert von DeepDiver am 10. Dezember 2007 21:30, insgesamt 1-mal geändert.
alfonsospringer
Beiträge: 75
Registriert: 25. September 2007 20:03

Beitrag von alfonsospringer »

und was muss ich einbinden um gDebug() nutzen zu können?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

QtDebug
alfonsospringer
Beiträge: 75
Registriert: 25. September 2007 20:03

Beitrag von alfonsospringer »

ich kriege keinerlei Ausgabe wenn ich qDebug("moin") in den Konstruktor setzte, selbst wenn es die einzige Codezeile im Konstruktor ist :(

Setzte ich es allerdings in die Mainfunktion bekomme ich die erwünschte Begrüßung - was ist bloß falsch?
twessels
Beiträge: 18
Registriert: 28. Mai 2007 13:23
Kontaktdaten:

Beitrag von twessels »

Wie ich schon sagte gibt es da zwei verschiedene Ansätze.
1. Laden der Lib beim Programmstart
2. Laden der Lib zur Laufzeit (so wie Du es derzeit machst)

2. geht nur wirklich einfach wenn man C-only Funktionen benutzt oder es als Plugin einsetzt (d.h. im Grunde eine C-only - Funktion die einen Ptr auf eine schöne virtuelle Klasse zurückgibt).

Wenn nichts wichtiges dagegen spricht ist 1.) immer vorzuziehen.
Hallo Christian,
es ist zwar schon ein paar Jahre her, aber kannst du mir vielleicht trotzdem erklären wie ich eine DLL beim Programmstart lade und dann im Programm die Funktionen aufrufe? QLibrary lädt, laut Trolltech, nur während der Laufzeit DLL Dateien (also kann ich die Klasse nicht benutzen).




libHeader

Code: Alles auswählen

#ifndef GEOMETRICS_H
#define GEOMETRICS_H

#ifdef Q_WS_WIN
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT
#endif 

#include <QtOpenGL>
extern "C" MY_EXPORT void drawSkyBox(const int textures, const GLfloat sz);
extern "C" MY_EXPORT void drawSkyDome(const int textures, const GLfloat sz);
extern "C" MY_EXPORT void drawSkySphere(const GLfloat sz);
extern "C" MY_EXPORT void drawGround(int texture);
extern "C" MY_EXPORT void wirePyramid();
extern "C" MY_EXPORT void solidPyramid();
extern "C" MY_EXPORT void wireCube();
extern "C" MY_EXPORT void solidCube();
extern "C" MY_EXPORT void texCube(const int texture);
extern "C" MY_EXPORT void wireSphere(float radius, int slices, int stacks);
extern "C" MY_EXPORT void solidSphere(float radius, int slices, int stacks);

#endif
libMain

Code: Alles auswählen

#include "geometrics.h"
#include <math.h>
extern "C" MY_EXPORT void wireSphere(float radius, int slices, int stacks)
{}
extern "C" MY_EXPORT void solidSphere(float radius, int slices, int stacks)
{}
extern "C" MY_EXPORT void drawGround(int texture)
{}
libProjectFile

Code: Alles auswählen

TEMPLATE = lib
HEADERS += geometrics.h
SOURCES += geometrics.cpp
QT += opengl
CONFIG += qt warn_on release dll
main.cpp

Code: Alles auswählen

...
void RenderThread::draw()
{
...
  drawSkyBox(textures[2], 25.0f);  //hier das problem
...
}
...
mainProjectFile

Code: Alles auswählen

TEMPLATE = app
DESTDIR = bin
OBJECTS_DIR = bin/build
MOC_DIR = bin/build
UI_DIR = bin/build
unix:LIBS += -L/usr/local/lib -lgeometrics
win32:LIBS += "C:/Dokumente und Einstellungen/b600693/Desktop/target/lib/geometrics.dll"
RESOURCES     = textures.qrc

HEADERS += src/openglwindow.h src/renderthread.h src/inputthread.h
SOURCES += src/openglwindow.cpp src/renderthread.cpp src/inputthread.cpp src/main.cpp
QT += opengl
CONFIG += qt release

DLL ist erstellt und kompilieren geht auch. Nur wie spreche ich jetzt in der main die DLL-Funktionen an?

Danke schonmal im voraus!
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Heaer-Datei einbinden und Funktion aufrufen - so wie Du es mit jeder anderen Funktion, die nicht von Dir kommt, auch machst.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
solarix
Beiträge: 1133
Registriert: 7. Juni 2007 19:25

Beitrag von solarix »

Du hast doch gleich auch die Antwort zu deiner Frage gepostet.. oder

Code: Alles auswählen

drawSkyBox(textures[2], 25.0f);  //hier das problem 
was denn für ein Problem?
twessels
Beiträge: 18
Registriert: 28. Mai 2007 13:23
Kontaktdaten:

Beitrag von twessels »

Zu dem Zeitpunkt wusste ich noch nicht, dass man einfach so die Funktion ansprechen kann...
Ich hatte auch nicht die Header-Dateien der Libraries eingebunden, wo die Funktionsprototypen drinstehen.

Naja jetzt hab ich alles fertig geschrieben und kompiliert.

Aber:

Code: Alles auswählen

t0bias@AMD64X2:~/Desktop/target/GLWidget/trunk$ bin/GLWidget
bin/GLWidget: error while loading shared libraries: libgeometrics.so.1: cannot open shared object file: No such file or directory
Muss ich Qt vielleicht noch irgendwie sagen, dass er die fertigen Libs in dem LD_LIBRARY_PATH packen soll?


PS: Danke für die schnellen Antworten!
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Woher soll Qt wissen was für einen LD_LIBRARY_PATH Du möchtest - das musst Du schon selbst machen.
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
twessels
Beiträge: 18
Registriert: 28. Mai 2007 13:23
Kontaktdaten:

Beitrag von twessels »

Oh okay. Läuft super jetzt! thx
Bitte seid so nett und ändert den Titel von Beiträgen die gelöst wurden, auf [gelöst] Beitragstitel
Antworten