DLL Laden mit QLibrary
-
Hallo Leute,
ich versuche momentan via QLibrary eine DLL (ebenfalls mit Qt erstellt) dynamisch einzubinden:
DLL:
#ifndef TESTLIB_GLOBAL_H #define TESTLIB_GLOBAL_H #include <QtCore/QtGlobal> #include "libwidget.h" #if defined(TESTLIB_LIBRARY) # define TESTLIBSHARED_EXPORT Q_DECL_EXPORT #else # define TESTLIBSHARED_EXPORT Q_DECL_IMPORT #endif extern "C" { TESTLIBSHARED_EXPORT int libStart(void) { qDebug("Started"); libwidget* lw = new libwidget; lw->show(); delete lw; return 0; } } #endif // TESTLIB_GLOBAL_H
Prog:
void Widget1::on_pushButton_clicked() { typedef int (*_LIBFUN)(void); QLibrary lib("testlib.dll"); if (!lib.load()) { qDebug("LIB_LOADERROR"); return; } else { _LIBFUN lfun = (_LIBFUN)(lib.resolve("libStart")); if (!lfun) { qDebug("FUNC_LOADERROR"); } else { auto ret = lfun(); if (ret != 0) qDebug("FUNC_ERROR"); else qDebug("OK"); } } lib.unload(); }
Das laden der DLL der funktioniert.
Allerdings wird die Funktion "libStart" scheinbar nicht gefunden, da er dann mit "FUNC_LOADERROR" aussteigt.Woran kann das liegen?
Schonmal danke im voraus
mfg NEO.PIXEL
-
die lib wird geladen, aber dein Symbol "libStart" wird nicht drinne gefunden werden !?
mach mal den dependency-walker auf und schau welche Symbole er kennt
wenn keine, dann wirst ihm wohl die funktionen ordnungsgemaess exportieren muessen ...
sehen die exportierten namen nur komisch aus, wirst wohl das c++ name-mergling abschalten muessen ! wobei das hasst ja scho ...
verlass dich nicht auf die win DECL makros (kann die der gcc-linker ueberhaupt ?) ... nimm lieber ne def zum exportieren der symbole.
Ciao
-
Keine Symbole drin..
Aber exportiert man so nicht in Qt?
Und wenn wie funktioniert das mit def-Dateien?EDIT: Und das merkwürdige ist dass es in der "Rohfassung", also ohne das Widget etc. funktioniert hat..
-
wie ohne widget funktioniert das ?
irgendwie ist dann da was anders?
Hasst in deinem DLL-Projekt aber auch TESTLIB_LIBRARY definiert?was sagt der dependency walker ?
(Übrigens das erste und wichtigste Werkzeug, wenn man mit dll's hantiert ..und dynamisch läd )Qt exportiert keine Symbole
Symbole exportiert der linker, wenn man ne dll baut ...
Dabei gibts 2 Wege ...Bei microsoft ueber die __declspec(dllexport) anweisung. Irgendwie muesste dein
TESTLIBSHARED_EXPORT in combination mit TESTLIBSHARED_EXPORT Q_DECL_EXPORT dahin aufloesen.
Keine AHnung ob dieser Weg auch mit dem gcc geht, aber scheinbar schon ...der 2. weg ist ueber eine .def datei
http://gcc.gnu.org/onlinedocs/gnat_ugn_unw/The-Definition-File.html
der gibts einfach expliziet an, welche funktionen in die DLL exporttabelle exportiert werden sollen. Die muss glaub ich wie das Project aber dann mit .def heissen und die musst dem compiler nur als source (also wie ne .cpp datei) uebergeben, damit kommt zumindest der Microsoft compiler klar. keine ahnung wie es beim gcc ist, aber denk ähnlich ...Ciao ...
-
Ja hab ich als LIBRARY definiert und der dependency walker findet keine Symbole.
Habe jetzt nochmal eine neue DLL erstellt:
#ifndef TESTDLL_GLOBAL_H #define TESTDLL_GLOBAL_H #include <QtCore/qglobal.h> #if defined(TESTDLL_LIBRARY) # define TESTDLLSHARED_EXPORT Q_DECL_EXPORT #else # define TESTDLLSHARED_EXPORT Q_DECL_IMPORT #endif #endif // TESTDLL_GLOBAL_H ######################################################################### #ifndef TESTDLL_H #define TESTDLL_H #include "testdll_global.h" #include <QDebug> class Testdll { public: Testdll() {qDebug("OK");} private: }; int TESTDLLSHARED_EXPORT libStart(void) { Testdll lib; return 0; } #endif // TESTDLL_H
Hier findet dependency walker jetzt das Symbol,
aber ich krieg es mit meinem Programm immer noch nicht geladen.??
-
Jetzt funktionierts..
Ich hätte die Implementierung nicht mit in den Header schreiben dürfen
Außerdem benötigte das Widget noch eine QApplication.