Russian Qt Forum
Май 17, 2024, 15:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: создание статической библиотеки и ошибка "The program has unexpectedly finished"  (Прочитано 7679 раз)
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #15 : Март 18, 2014, 14:31 »

Параллельный вопрос - получается достаточно одного Q_DECL_EXPORT в начале заголовочника и не обязательно его писать у каждой функции?

нет, это просто неправильный код. К слову, с MinGW я не видел проблем, когда Q_DECL_EXPORT не используется.
Записан
OKTA
Гость
« Ответ #16 : Март 18, 2014, 14:39 »

ничего не понимаю) ставишь в заголовочнике - экспортируются все, ставишь у функции - экспортируется только она.
А насчет статики? Qt не обязательно разве пересобирать?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #17 : Март 18, 2014, 14:45 »

ничего не понимаю) ставишь в заголовочнике - экспортируются все, ставишь у функции - экспортируется только она.

нужно писать возле каждой функции. У автора это не используется.

А насчет статики? Qt не обязательно разве пересобирать?

Нет, а зачем? Тут не используется статическая линковка с Qt, а только со своей собственной библиотекой.

Если же автор хотел получить полностью статический бинарник, то он ошибался, и Qt действительно нужно будет пересобирать.
Записан
OKTA
Гость
« Ответ #18 : Март 18, 2014, 14:53 »

А если явно не экспортировать методы, разве они должны сами по себе экспортироваться?  Непонимающий
Записан
libertas
Гость
« Ответ #19 : Март 18, 2014, 15:00 »

Q_DECL_EXPORT -на сайте qt написано, что используется для shared library -
http://qt-project.org/doc/qt-4.8/qtglobal.html#Q_DECL_EXPORT

Записан
libertas
Гость
« Ответ #20 : Март 18, 2014, 15:02 »

Код:
А если явно не экспортировать методы, разве они должны сами по себе экспортироваться?

На сколько я успел понять, то что если указать в
LIBS в .pro клиента путь до библиотеки, то таким образом мы подключаем библиотеку.
Записан
OKTA
Гость
« Ответ #21 : Март 18, 2014, 15:34 »

да, верно. из-за того, что статическая библиотека всаживается прямо в приложение ничего экспортировать не нужно.
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #22 : Март 18, 2014, 15:47 »

А если явно не экспортировать методы, разве они должны сами по себе экспортироваться?  Непонимающий

насколько я знаю, это MSVC хрень (http://msdn.microsoft.com/ru-ru/library/a90k134d.aspx), а также хрень для компиляторов, где глобальный символ нужно экспортировать. При использовании MinGW, и тем более на Linux/gcc, я не видел ошибок когда Q_DECL_EXPORT НЕ используется.
« Последнее редактирование: Март 18, 2014, 15:52 от Alex Custov » Записан
libertas
Гость
« Ответ #23 : Март 20, 2014, 08:29 »

Разобрался я со своими ошибками. Хочу выложить сюда алгоритм создания  клиента Qt/ статической библиотеки Qt. Может быть кому-то это поможет.

Создание библиотеки в QT creator
  • New project -> Libraries -> C++ Library -> Choose; Type - Statically Linked Library; Name - static_lib.Далее все next
  • После создания проекта для библиотеки для удобства нужно отключить теневую сборку: Project ->Shadow build->false
  • В библиотеки опишем функцию сложения. Описание класса, созданное wizardом по умолчанию в файлах проекта удаляем. Он нам не пригодится.
  • В static_lib.h объявляем функцию сложения: double add(double, double); В static_lib.cpp определяем функцию сложения:
Код:
double add(double first, double second)
{
    return first + second;
}
.
  • Собираем проект.
  • Редактируем файл static_lib.pro. Для удобства определяем каталог размещения библиотеки: : DESTDIR = ../lib. Собираем проект.

Библиотека готова, теперь создаем gui-клиента на qt
  • New project -> Applications -> Qt Widgets Application-> Choose; Name - client; Далее все next
  • После создания проекта для библиотеки для удобства нужно отключить теневую сборку: Project ->Shadow build->false
  • Создадим в дизайнере в форме два QLineEdit поля ввода значений(назовем их first и second),кнопку add и поле вывода QLabel(назовем result)
  • Напишем обработчик события для кнопки add: Правой кнопкой мыши на кнопке - go to slot - Clicked. В обработчике пишем код, где вызываем нашу функцию из библиотеки:
Код:
void MainWindow::on_add_clicked()
{
    QString first = ui->first->text();
    QString second = ui->second->text();
    int ifirst = first.toInt();
    int isecond = second.toInt();
    int result = add(ifirst, isecond);
    ui->result->setNum(result);
}
  • Редактируем файл client.pro -
     
Код:
INCLUDEPATH += ../static_lib #путь к хедеру библиотеки

LIBS += ../lib/libstatic_lib.a#путь к самой библиотеке.
  • Подключаем #include "static_lib.h" в mainwindow.cpp(в коде, где будем использовать функцию библиотеки)
  • Собираем проект, запускаем - проверяем =)
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.045 секунд. Запросов: 19.