• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Linux QT - Biblioteka shared Library z UI

Object Storage Arubacloud
+2 głosów
364 wizyt
pytanie zadane 18 kwietnia 2015 w C i C++ przez Sopri Nowicjusz (220 p.)
edycja 18 kwietnia 2015 przez Sopri

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.

 

1 odpowiedź

+2 głosów
odpowiedź 18 kwietnia 2015 przez Sopri Nowicjusz (220 p.)
Udało mi sie rozwiaza problem wystarczylo funkcje oznaczona jako extern przeniesc do pliku cpp biblioteki.

Podobne pytania

0 głosów
0 odpowiedzi 300 wizyt
pytanie zadane 27 maja 2021 w C i C++ przez ifuknowme555 Początkujący (410 p.)
0 głosów
1 odpowiedź 133 wizyt
pytanie zadane 18 stycznia 2019 w Systemy operacyjne, programy przez Rosol Kuba Początkujący (380 p.)
0 głosów
1 odpowiedź 157 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez alien1983 Początkujący (280 p.)

92,579 zapytań

141,432 odpowiedzi

319,664 komentarzy

61,964 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...