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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: создание статической библиотеки и ошибка "The program has unexpectedly finished"  (Прочитано 8004 раз)
libertas
Гость
« : Март 17, 2014, 22:24 »

Всем привет!

Хочу создать и использовать статическую библиотеку в клиенте(функции для калькулятора).

Создал в creatore статическую библиотеку, получил 4 файла:
-stat_lib.pro
-stat_lib.h
-stat_lib_global.h
-stat_lib.cpp

В stat_lib.pro добавил DESTDIR += ../lib (По заданию в этом каталоге должна стать библиотека, но у меня ничего не появилось после сборки...)

В stat_lib.h описал экспортируемые функции:
Код:
int add(int, int);

int mul(int, int);

int subtract(int, int);

int divide(int, int);

В stat_lib.cpp определил экспортируемые функции:
Код:
int add(int first_value, int second_value)
{
    return first_value + second_value;
}

int subtract(int first_value, int second_value)
{
    return first_value - second_value;
}

int mul(int first_value, int second_value)
{
    return first_value - second_value;
}

int divide (int first_value, int second_value)
{
    return first_value / second_value;
}

Далее создал клиента на базе QMainWindow:

- в mainwindow.h включил #include "stat_lib.h"
- в проекте указал путь к .h файлу - INCLUDEPATH+= ../stat_lib  и саму библиотеку LIBS+=  ../lib/libstat_lib.a

В клиенте описал функцию сложение:
Код:
void MainWindow::on_add_clicked()
{
    QString first_value = ui->first_value->text();
    QString second_value = ui->second_value->text();
    int ifirst_value = first_value.toInt();
    int isecond_value = second_value.toInt();
    int result = add(ifirst_value, isecond_value);
    ui->result->setNum(result);
}

И теперь когда запускаю run клиента получаю ошибку:
Starting D:\Temp\C++\QT_labs\Client\debug\Client.exe...
The program has unexpectedly finished.
D:\Temp\C++\QT_labs\Client\debug\Client.exe crashed

Из-за чего это может происходить?
Спасибо.

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

Понял, что ошибка происходит, на строчке:

Код:
int resul = add(ifirst_value, isecond_value);

Но что с ней не так?
Записан
Bepec
Гость
« Ответ #2 : Март 18, 2014, 09:45 »

Половины кода нет, про файла полностью нет. Могу только протелепатировать, что у вас где-то что-то не так Веселый
Записан
OKTA
Гость
« Ответ #3 : Март 18, 2014, 09:47 »

Наверно Боги придумали debug  Строит глазки
Записан
libertas
Гость
« Ответ #4 : Март 18, 2014, 12:51 »

Цитировать
Половины кода нет, про файла полностью нет.

stat_lib.pro

Код:
QT       -= gui

TARGET = stat_lib
TEMPLATE = lib

DEFINES += STAT_LIB_LIBRARY

SOURCES += stat_lib.cpp

HEADERS += stat_lib.h\
        stat_lib_global.h

unix {
    target.path = /usr/lib
    INSTALLS += target
}

DESTDIR += ../lib

client.pro

Код:
QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = Client
TEMPLATE = app


SOURCES += main.cpp\
        mainwindow.cpp

HEADERS  += mainwindow.h

FORMS    += mainwindow.ui

INCLUDEPATH += ../stat_lib

LIBS += ../lib/libstat_lib.a

stat_lib.h

Код:
#ifndef STAT_LIB_H
#define STAT_LIB_H

#include "stat_lib_global.h"

#endif // STAT_LIB_H


int add(int, int);

stat_lib_global.h
Код:
#ifndef STAT_LIB_GLOBAL_H
#define STAT_LIB_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(STAT_LIB_LIBRARY)
#  define STAT_LIBSHARED_EXPORT Q_DECL_EXPORT
#else
#  define STAT_LIBSHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // STAT_LIB_GLOBAL_H

stat_lib.cpp
Код:
#include "stat_lib.h"

int add(int first_value, int second_value)
{
    return (first_value + second_value);
}

client

mainwindow.h
Код:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "stat_lib.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private slots:
    void on_add_clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

main.cpp

Код:
#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}


mainwindow.cpp

Код:
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_add_clicked()
{
    QString first_value = ui->first_value->text();
    QString second_value = ui->second_value->text();
    int ifirst_value = first_value.toInt();
    int isecond_value = second_value.toInt();
    int result = add(ifirst_value, isecond_value);
    //ui->result->setNum(result);
}
Записан
libertas
Гость
« Ответ #5 : Март 18, 2014, 12:53 »

Код:
Наверно Боги придумали debug

В отладчик не заходит. Появляется ошибка "during startup program exited with code 0xc0000135"
Записан
OKTA
Гость
« Ответ #6 : Март 18, 2014, 13:05 »

Судя по коду,  функции из библиотеки просто не экспортируются. Не хватает Q_DECL_EXPORT в заголовочнике перед int add()
« Последнее редактирование: Март 18, 2014, 13:11 от OKTA » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #7 : Март 18, 2014, 13:11 »

скинь полный архив с минимальными исходниками.
Записан
libertas
Гость
« Ответ #8 : Март 18, 2014, 13:17 »

Цитировать
скинь полный архив с минимальными исходниками

добавил во вложение.
Записан
libertas
Гость
« Ответ #9 : Март 18, 2014, 13:19 »

Цитировать
Не хватает Q_DECL_EXPORT в заголовочнике перед int add()

добавил в stat_lib.h Q_DECL_EXPORT перед  int add(int, int), пересобрал оба проекта - запускаю клиента - то же самое.
Записан
OKTA
Гость
« Ответ #10 : Март 18, 2014, 13:26 »

А сама Qt статически собрана?
Делаешь dll - все ок, ф-ии экспортируются, а в статике пусто. Я может конечно что-то путаю, но вроде всегда статическая сборка зависела от статической сборки Qt.
« Последнее редактирование: Март 18, 2014, 13:29 от OKTA » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #11 : Март 18, 2014, 13:34 »

в исходниках не хватает формы. Вместо ручного ввода на форме я захардкодил значения:

Код
C++ (Qt)
   QString first_value = "2";
   QString second_value = "5";

Всё работает. Попробуй тоже захардкодить. Если заработало, то неправильно выполняется преобразование из QString в int.
Записан
libertas
Гость
« Ответ #12 : Март 18, 2014, 13:59 »

Цитировать
А сама Qt статически собрана?
Делаешь dll - все ок, ф-ии экспортируются, а в статике пусто. Я может конечно что-то путаю, но вроде всегда статическая сборка зависела от статической сборки Qt.

был type у библиотеки  shared library. я сейчас создал занова оба проекта, теперь у библиотеки выбрал static library.

Но все равно тоже самое. У меня в папке lib, которую я указал как DESTDIR = ../lib ничего не создается

а в .pro  у клиента я указал
 INCLUDEPATH+= ../stat_lib

LIBS+=  ../lib/libstat_lib.a

может в этом дело?
Записан
libertas
Гость
« Ответ #13 : Март 18, 2014, 14:10 »

Такое чувство, что дело с путями

Сейчас такая структура:

проект client - QT_labs\client
проект stat_lib - QT_labs\stat_lib
библиотеки - QT_labs\lib и там есть libstat_lib.a и stat_lib.dll

В client.pro -
INCLUDEPATH+= ../stat_lib

LIBS+=  ../lib/libstat_lib.a

В stat_lib.pro -

DESTDIR = ../lib

и все равно ошибка.
Записан
OKTA
Гость
« Ответ #14 : Март 18, 2014, 14:22 »

Параллельный вопрос - получается достаточно одного Q_DECL_EXPORT в начале заголовочника и не обязательно его писать у каждой функции?
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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