Название: И снова о динамических библиотеках...... Отправлено: wertklop от Февраль 26, 2011, 21:07 Всем привет!
После долгих исканий в инете, прочтения доков, а также здесь на форуме, что то нашёл дря решения своего вопроса, но не до конца. Суть задачки вот в чём: Для примера, хотелось бы, чтобы при старте приложения загружалась библиотека (*.so) и делала необходимые действия. Исходники приложения: mainwindow.h Код: #ifndef MAINWINDOW_H Код: #ifndef INTERFACE_H Код: #include "mainwindow.h" Код: #include <QApplication> Код: QT += core gui Исходники библиотеки: interface.h Код: #ifndef INTERFACE_H Код: #ifndef PLUGIN_H Код: #include <QtGui> Код: TEMPLATE = lib Т.е. у нас получилось, что interface.h, с конкретными определёнными методами, и в библиотеке, и в приложении, иначе не работает. за основу брал примеры http://www.prog.org.ru/topic_8259_0.html (http://www.prog.org.ru/topic_8259_0.html), http://www.prog.org.ru/index.php?topic=4120.msg18558#msg18558 (http://www.prog.org.ru/index.php?topic=4120.msg18558#msg18558) и http://www.prog.org.ru/index.php?topic=8357.msg45637#msg45637 (http://www.prog.org.ru/index.php?topic=8357.msg45637#msg45637), http://www.e-reading.org.ua/bookreader.php/136170/Blanshet_-_QT_4%3A_programmirovanie_GUI_na_S%2B%2B.html (http://www.e-reading.org.ua/bookreader.php/136170/Blanshet_-_QT_4%3A_programmirovanie_GUI_na_S%2B%2B.html)(20 глава). Но хотелось бы средствами Qt, если это воможно, не определять явно интерфейс в приложении(потому как это плохо), а просто загрузить библиотеку, вызвать нужный нам метод(или что-то другое), а потом, если надо, то выгрузить библиотеку. Короче, что то подобное расписано на http://www.ibm.com/developerworks/ru/library/l-dynamic-libraries/index.html (http://www.ibm.com/developerworks/ru/library/l-dynamic-libraries/index.html). Повторю, хотелось бы реализовать именно стрествами Qt, если это возможно. Название: Re: И снова о динамических библиотеках...... Отправлено: Hronom от Февраль 27, 2011, 00:07 Посмотрите в сторону QLibrary::resolve я сам не пробовал, но вроде там написано как можно дёргать функции из либы без использования интерфейса.
Название: Re: И снова о динамических библиотеках...... Отправлено: wertklop от Февраль 27, 2011, 01:11 Удалил из приложения interface.h
Попробовал вот так, как в Аssistant'е: Код: typedef Qstring (*MyPrototype)(); Название: Re: И снова о динамических библиотеках...... Отправлено: Hronom от Февраль 27, 2011, 01:32 Удалил из приложения interface.h Попробовал вот так, как в Аssistant'е: Код: typedef Qstring (*MyPrototype)(); Судя по асисту нужно ещё произвести махинацию над функцией в либе что-то вроде этого: Код: extern "C" MY_EXPORT int avg(int a, int b) Код: #ifdef Q_WS_WIN Название: Re: И снова о динамических библиотеках...... Отправлено: wertklop от Февраль 27, 2011, 01:58 Возможно это прокатило, но мне надо в linux, поэтому у меня пишет ".../plugin.h:23: error: expected unqualified-id before string constant" в строке "extern "C" MY_EXPORT void run()". Усли убрать определение MY_EXPORT, то всё равно та же ошибка
Название: Re: И снова о динамических библиотеках...... Отправлено: Hronom от Февраль 27, 2011, 02:21 Вот правильные исходники
plugin.h Код: #ifndef PLUGIN_H Код: #include <QtGui> Если не поможет могу пошарить в проекте(залейте его куда-то) ибо мне тоже эта тема интересна, моя программа сейчас работает на интерфейсах... Название: Re: И снова о динамических библиотеках...... Отправлено: wertklop от Февраль 27, 2011, 02:30 Hronom , ты проверял их? я привёл к виду, как ты написал, всё равно та же ошибка. и ещё вопрос, а куда ты интерфейс подевал, он что не нужен разве???
Название: Re: И снова о динамических библиотеках...... Отправлено: Hronom от Февраль 27, 2011, 02:32 Hronom , ты проверял их? я привёл к виду, как ты написал, всё равно та же ошибка. и ещё вопрос, а куда ты интерфейс подевал, он что не нужен разве??? Интерфейс в модуле не нужен если ты через него не работаешь, залей архивчик с исходниками куда-то)))Название: Re: И снова о динамических библиотеках...... Отправлено: wertklop от Февраль 27, 2011, 02:40 тут в архиве проекты библиотеки и приложения. к коментариях есть пробная реализация Сишной ф-ции(с сайта IBM)
Название: Re: И снова о динамических библиотеках...... Отправлено: Hronom от Февраль 27, 2011, 03:45 Вобщем, получилось... но вызывать с либы удалось только функцию, но не метод класса.
Название: Re: И снова о динамических библиотеках...... Отправлено: wertklop от Февраль 27, 2011, 04:06 Ну спасибо хоть и на этом :)
только вот у меня несколько вопросов, просвяти: 1)xLibrary->setLoadHints(QLibrary::ResolveAllSymbolsHint); - почему ты её закомментил и зачем она нужна? Кстати, пробовал run2() сделать не от типа int, а qt'шным типом(QObject), компилятор выдал, что невозможно вызвать не скалярную ф-цию. Я так понимаю, что мы же экстерном вызываем ф-цию сишного типа, а в С вроде как нет ни объектов, ни чего-то подобного......Можно сделать и так, но опять же с типами, которые поддерживат С: Код: extern "C" MY_EXPORT int run2() Название: Re: И снова о динамических библиотеках...... Отправлено: Hronom от Февраль 27, 2011, 14:10 Ну спасибо хоть и на этом :) У меня запахало с QString'ом и QObject* вместо int... ниже прикреплены исходники) Я так понимаю и свои классы можно тоже гонять...только вот у меня несколько вопросов, просвяти: 1)xLibrary->setLoadHints(QLibrary::ResolveAllSymbolsHint); - почему ты её закомментил и зачем она нужна? Кстати, пробовал run2() сделать не от типа int, а qt'шным типом(QObject), компилятор выдал, что невозможно вызвать не скалярную ф-цию. Я так понимаю, что мы же экстерном вызываем ф-цию сишного типа, а в С вроде как нет ни объектов, ни чего-то подобного......Можно сделать и так, но опять же с типами, которые поддерживат С: Код: extern "C" MY_EXPORT int run2() |