Автор Тема: Как се създават и използват библиотеки в Qt4  (Прочетена 1190 пъти)

X_F1

  • Участници
  • ***
  • Публикации: 3
    • Профил
Здравейте! Нов съм в Qt4 (от два месеца!

Използвам Qt Creator, правя нова библиотека, после правя нов проект, инклудвам -

Код
GeSHi (C++):
  1. release/mainwindow.o:mainwindow.cpp:(.text+0xbd): undefined reference to `_imp___ZN5LibesC1Ev'
  2. release/mainwindow.o:mainwindow.cpp:(.text+0x11d): undefined reference to `_imp___ZN5LibesC1Ev'

Може ли да ми дадете линк към статия, или да ми обясните как става номера, като фатката е - да създам библиотеката през Qt Creator, и през QtCreator да я инклудна в моя си проект. Смятам да я ползвам в повече от един проект!

Благодаря!
Активен

remotex

  • Напреднали
  • *****
  • Публикации: 344
    • Профил
http://doc.trolltech.com/latest/qmake-project-files.html#declaring-other-libraries

Какво добавяш : само заглавния файл или и изпълнимия т.е. LIBS += и/ли INCLUDEPATH = трябва и двете, после зависи дали е qmake или cmake project ...
Я най-добре намери и прочети в помощната информация следната секция "External Libraries"
Активен

task_struct

  • Напреднали
  • *****
  • Публикации: 576
  • Distribution: Kubuntu 14.04
  • Window Manager: KDE 4.13
    • Профил
Активен

"Minds are like parachutes. They only function when they are open." - James Dewar

irc.freenode.net  / #linux-bg

X_F1

  • Участници
  • ***
  • Публикации: 3
    • Профил
Ето ти и за cmake проект: http://techbase.kde.org/Development/Tutorials/Creating_Libraries :)
Аз използвам чист Qt4. Ако може да е точно за Qt4.  :)
Активен

bvbfan

  • Напреднали
  • *****
  • Публикации: 1056
  • Distribution: KaOS
  • Window Manager: Plasma 5
    • Профил
Активен

X_F1

  • Участници
  • ***
  • Публикации: 3
    • Профил
Пак не става.  :(

QLibrary *l = new QLibrary("lib1.dll");
    l->load();

    l->resolve("Lib1::showButton()");

обаче - пак не дава.  :( В случая не показва бутона!
Активен

bvbfan

  • Напреднали
  • *****
  • Публикации: 1056
  • Distribution: KaOS
  • Window Manager: Plasma 5
    • Профил
Цитат
("Lib1::showButton()");
Това действие не е възможно при която и да е ОС, не може да вземеш указател към статична функция от клас без да си създал класа, тъй като няма кой да извика конструктора.
Това се прави така:
class Myclass {
 Myclass() {}
 int func1();
 char *funcN();
};
extern "C"
{
    Myclass* getClass();
    typedef Myclass*(*func)();
}

Хедър файла трябва да е и в двата проекта

В динамичната библиотека

int Myclass::func1() { return 50; }
char* Myclass::funcN() { return "This is version 1.0"; }

Myclass* getClass()
{
   Myclass *p = new Myclass;
   return p;
}

В програмата, къде зареждаш библиотеката

QLibrary *l = new QLibrary("lib1.dll");
    l->load();

    Myclass *f = (func)l->resolve("getClass");
    if( f != NULL )
      puts( f->funcN() );

example

На линукс библиотеките трябва да са импортнати в Path или сложи симболик линк в /usr/lib/ към твойта библиотека
« Последна редакция: Sep 15, 2010, 15:40 от bvbfan »
Активен

task_struct

  • Напреднали
  • *****
  • Публикации: 576
  • Distribution: Kubuntu 14.04
  • Window Manager: KDE 4.13
    • Профил
Според мен подхода с QLibrary не е най-доброто решение в този случай. QLibrary е подходяща в случайте, когато искаш да заредиш определен код, само ако е нужно. На пример, имаш много плъгини, които не са нужни непрекъснато, а само ако потребителя заяви желание да ги използва. За библиотека, която ще предоставя някаква функционалност на много приложения, е по-добре (даже си е задължително) да се инсталира отделно и приложенията да са линкнати към нея, както е обяснено тук: http://doc.trolltech.com/latest/qmake-project-files.html#declaring-other-libraries
Активен

"Minds are like parachutes. They only function when they are open." - James Dewar

irc.freenode.net  / #linux-bg