• 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

+2 głosów
492 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 561 wizyt
pytanie zadane 27 maja 2021 w C i C++ przez ifuknowme555 Początkujący (410 p.)
0 głosów
1 odpowiedź 272 wizyt
pytanie zadane 18 stycznia 2019 w Systemy operacyjne, programy przez Rosol Kuba Początkujący (380 p.)
0 głosów
1 odpowiedź 285 wizyt
pytanie zadane 3 grudnia 2016 w C i C++ przez alien1983 Początkujący (280 p.)

93,771 zapytań

142,731 odpowiedzi

323,383 komentarzy

63,372 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...