Seite 1 von 1
Bibliothek als Shared Library bzw. DLL erstellen
Verfasst: 9. August 2006 16:13
von stimpy
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
Verfasst: 9. August 2006 20:03
von Christian81
Verfasst: 10. August 2006 09:19
von stimpy
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
DLL bauen und aufrufen
Verfasst: 10. August 2006 15:15
von stimpy
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:
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_*/
CPP der DLL:
Code: Alles auswählen
#include <iostream>
void hallo_dll()
{
std::cout << "DLL: Tach!\n";
}
PRO-File der DLL:
Das Testprogram in main.cpp:
Code: 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;
}
PRO-File des Tesprogrammes:
Code: Alles auswählen
TEMPLATE = app
INCLUDEPATH += ../pfad_zum_test_header
LIBS += "../pfad_zur_test_dll/test.dll"
SOURCES += main.cpp
Verbesserungsvorschläge sind immer willkommen!
Verfasst: 10. August 2006 15:23
von Christian81
Der Header ist komplett falsch - siehe anderer Thread!
Verfasst: 10. August 2006 17:25
von stimpy
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?
Verfasst: 11. August 2006 09:53
von Christian81
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.
Danke!
Verfasst: 11. August 2006 10:51
von stimpy
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:
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
#endif
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!