Witam
Dopiero zaczynam przygode z QT i natknalem sie na pewien problem.
Pracuje na systemie
Linux: Ubuntu 14.04.2 LTS \n \l
Kernel: Linux Solaris 3.13.0-49-generic #83-Ubuntu SMP Fri Apr 10 20:11:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Posiadam wersje QT:
QMake version 3.0
Using Qt version 5.2.1 in /usr/lib/x86_64-linux-gnu
I teraz opis problemu:
chce napisać obiblioteke ktora bedzie dynamicznie dolaczana do projektu. Ma dzialac jak plugin.
wiec stworzylem projekt w qtwidget oraz biblioteke shared librabry UI.
Chce aby program tak dzialal aby po dodaniu nowej biblioteki pokazywaly sie nowe zakladki w aplikacji z formami z bibliotek.
dlatego w bibliotece w naglowku napisalem taka funkcje:
#if defined TEST
#define TEST_COMMON_DLLSPEC Q_DECL_EXPORT
#else
#define TEST_COMMON_DLLSPEC Q_DECL_IMPORT
#endif
extern "C" TEST_COMMON_DLLSPEC Form* createForm(){
return new Form();
}
a w glownej aplikacji w konstruktorze klasy okna posiadam taki kod:
QWidget *pp;
QString path = "p/libDynamiclibs.so";
if (QLibrary::isLibrary(path))
QMessageBox::information(NULL, "jest", "Plik");
QLibrary test(path);
test.load();
if (test.isLoaded())
QMessageBox::information(NULL, "zaladowana", "TAK");
else
QMessageBox::information(NULL, "zaladowana", "NIE");
typedef QWidget* (*Moja)();
Moja myfunc = (Moja)test.resolve("createForm");
if (myfunc)
{
pp = myfunc();
QMessageBox::information(NULL, "dziala!", "Hi!");
}
else
QMessageBox::information(NULL, "nie dziala", "HI");
ui->tabWidget->addTab(pp,"Powiadomienia");
Po takim zabiegu w bibliotece otrzymuje blad:
/home/gora/Programowanie/QT/testDynamic/Dynamiclibs/form.h:31: error: multiple definition of `createForm'
Przegladajac rozne fora dowiedzialem sie ze ten blad nalezy rozwiazac tworzac funkcje createForm jako inline.
Niestety jednak wtedy glowna aplikacja nie widzi funkcji z biblioteki "myfunc" jest 0.
Wiec pomyslalem ze nie mooge pozwolic sobie na funkcje typu inline. Dlatego pozbylem sie slowa kluczowego inline i usunalem w bibliotece slowo kluczowe Q_Object i nagle kompilacja przebiegla prawidlowo. Po dodaniu labela w formie w bibliotece pokazal sie tak jak planowalem w nowej zakladce aplikacji glownej.
Problem polega na tym ze gdy chce teraz dodac jakis przycisk to otrzymuje taki blad:
/home/gora/Programowanie/QT/testDynamic/Dynamiclibs/form.h:24: Error: Class declarations lacks Q_OBJECT macro.
Przez co rozumiem ze Q_OBJECT musi jednak byc.
Zaznacze ze oczywiscie przekopiowalem biblioteki skompilowane do katalogu z aplikacja.
Prosze o podpowiedz jak to prawidlowo powinienem rozwiazac, aby w bibliotece mogl tworzyc formy ktore bede pozniej dodawal do kolejnych tab-ow w aplikacji.