Bibliothek als Shared Library bzw. DLL erstellen
Bibliothek als Shared Library bzw. DLL erstellen
Hallo,
ich möchte ein plattformübergreifendes Projekt in DLLs zerlegen.
Eine DLL habe ich schon erzeugt, indem ich in der .pro-Datei den Eintrag
"TEMPLATE = lib" gesetzt habe. Daraufhin erhielt ich unter Windows tatsächlich eine DLL.
Wie kann ich jetzt die Funktionen von außerhalb aufrufen (mit QLibrary?)?
Genauer gesagt, was muß ich qmake mitteilen (LIBS += ...) ?
Muß ich unter Windows immer "__declspec(dllexport)" verwenden?
Werden auf anderen Systemen wirklich alle Funktionen exportiert?
Irgendwie kann ich mich mit der Hilfe zu qmake nicht anfreunden.
Da steht zwar alles drin, aber man findet nix zur praktischen Anwendung.
Vielen Dank,
Stimpy
ich möchte ein plattformübergreifendes Projekt in DLLs zerlegen.
Eine DLL habe ich schon erzeugt, indem ich in der .pro-Datei den Eintrag
"TEMPLATE = lib" gesetzt habe. Daraufhin erhielt ich unter Windows tatsächlich eine DLL.
Wie kann ich jetzt die Funktionen von außerhalb aufrufen (mit QLibrary?)?
Genauer gesagt, was muß ich qmake mitteilen (LIBS += ...) ?
Muß ich unter Windows immer "__declspec(dllexport)" verwenden?
Werden auf anderen Systemen wirklich alle Funktionen exportiert?
Irgendwie kann ich mich mit der Hilfe zu qmake nicht anfreunden.
Da steht zwar alles drin, aber man findet nix zur praktischen Anwendung.
Vielen Dank,
Stimpy
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Danke, das hilft mir zwar nur teilweise weiter, aber ich habe jetzt was gefunden:
http://cartan.cas.suffolk.edu/oopdocboo ... ils.tar.gz
Da wird eine Bibliothek nebst Testprogrammerstellt.
Da ackere ich mich mal durch. Da lerne ich noch ein wenig die qmake-Files kennen.
Das Beispiel ist aus dem im Forum bereits erwähnten eBook:
http://cartan.cas.suffolk.edu/moin/OopD ... =main.html
Danke,
Stimpy
http://cartan.cas.suffolk.edu/oopdocboo ... ils.tar.gz
Da wird eine Bibliothek nebst Testprogrammerstellt.
Da ackere ich mich mal durch. Da lerne ich noch ein wenig die qmake-Files kennen.
Das Beispiel ist aus dem im Forum bereits erwähnten eBook:
http://cartan.cas.suffolk.edu/moin/OopD ... =main.html
Danke,
Stimpy
DLL bauen und aufrufen
Manchmal steht man aber auch etwas auf dem Schlauch.
Irgendwo einen falschen Pfad eingetragen und schon meint man, daß nix mehr geht.
Für alle die es probieren wollen:
Header meiner DLL:
CPP der DLL:
PRO-File der DLL:
Das Testprogram in main.cpp:
PRO-File des Tesprogrammes:
Verbesserungsvorschläge sind immer willkommen!
Irgendwo einen falschen Pfad eingetragen und schon meint man, daß nix mehr geht.
Für alle die es probieren wollen:
Header meiner DLL:
Code: Alles auswählen
#ifndef TEST_H_
#define TEST_H_
#ifdef Q_WS_WIN
#define MY_EXPORT __declspec(dllexport)
#else
#define MY_EXPORT
#endif
void MY_EXPORT hallo_dll();
#endif /*TEST_H_*/Code: Alles auswählen
#include <iostream>
void hallo_dll()
{
std::cout << "DLL: Tach!\n";
}Code: Alles auswählen
TEMPLATE = lib
HEADERS += test.h
SOURCES += test.cppCode: Alles auswählen
#include <iostream>
#include "../pfad_zum_test_header/test.h"
int main( int argc, char **argv )
{
std::cout << "EXE: Moin!\n";
hallo_dll();
return 0;
}Code: Alles auswählen
TEMPLATE = app
INCLUDEPATH += ../pfad_zum_test_header
LIBS += "../pfad_zur_test_dll/test.dll"
SOURCES += main.cpp-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Komplett falsch?
Ich neme an, Du meinst die #defines am Anfang des Headers?
Die habe ich 1:1 aus dem obengenannten OOPDocbook.
Zu Q_DECL_IMPORT und Q_DECL_EXPORT habe ich keine Doku gefunden.
1) Vermutlich könnte ich stattdessen __declspec(dllimport) bzw. __declspec(dllexport) schreiben?
#ifdef MAKE_MEINTABLE_LIB
2) Das unterscheidet wohl, ob ich Ersteller oder Nutzer der Bibliothek bin?
Ich neme an, Du meinst die #defines am Anfang des Headers?
Die habe ich 1:1 aus dem obengenannten OOPDocbook.
Zu Q_DECL_IMPORT und Q_DECL_EXPORT habe ich keine Doku gefunden.
1) Vermutlich könnte ich stattdessen __declspec(dllimport) bzw. __declspec(dllexport) schreiben?
#ifdef MAKE_MEINTABLE_LIB
2) Das unterscheidet wohl, ob ich Ersteller oder Nutzer der Bibliothek bin?
-
Christian81
- Beiträge: 7319
- Registriert: 26. August 2004 14:11
- Wohnort: Bremen
- Kontaktdaten:
Ich meine natürlich die import/export Definitionen.
Als Erzeuger muss es dllexport, als Beenutzer dllimport sein. Da es aber unter linux etwas anders ist, muss die Definition so sein wie im anderen Thread, wobei dann beim Erstellen das Define gesetzt sein muss.
Q_DECL_EXPORT/IMPORT gibt es erst ab Qt4 - man sollte sie dann auch benutzen da dort z.B. auch die visibility für gcc >= 4 gesteuert wird.
Als Erzeuger muss es dllexport, als Beenutzer dllimport sein. Da es aber unter linux etwas anders ist, muss die Definition so sein wie im anderen Thread, wobei dann beim Erstellen das Define gesetzt sein muss.
Q_DECL_EXPORT/IMPORT gibt es erst ab Qt4 - man sollte sie dann auch benutzen da dort z.B. auch die visibility für gcc >= 4 gesteuert wird.
MfG Christian
'Funktioniert nicht' ist keine Fehlerbeschreibung
'Funktioniert nicht' ist keine Fehlerbeschreibung
Danke!
Ich habe es mir gerade zusammengesucht.
Q_DECL_EXPORT / IMPORT sind in der qglobal.h definiert aber nicht in der QT-Doku erwähnt. Damit ist mir auch Dein Header verständlich.
qglobal.h:
Damit ist jetzt auch eine meiner ersten Fragen gelöst. Unter Windows konnte man mit __declspec(dllexport) nur einzelne Funktionen der DLL exportieren. Das geht jetzt mit dem GNU Compiler erst mit neueren Versionen: http://gcc.gnu.org/wiki/Visibility
Vielen Dank!
Q_DECL_EXPORT / IMPORT sind in der qglobal.h definiert aber nicht in der QT-Doku erwähnt. Damit ist mir auch Dein Header verständlich.
qglobal.h:
Code: Alles auswählen
#ifndef Q_DECL_EXPORT
# ifdef Q_OS_WIN
# define Q_DECL_EXPORT __declspec(dllexport)
# elif defined(QT_VISIBILITY_AVAILABLE)
# define Q_DECL_EXPORT __attribute__((visibility("default")))
# endif
# ifndef Q_DECL_EXPORT
# define Q_DECL_EXPORT
# endif
#endif
#ifndef Q_DECL_IMPORT
# ifdef Q_OS_WIN
# define Q_DECL_IMPORT __declspec(dllimport)
# else
# define Q_DECL_IMPORT
# endif
#endifVielen Dank!