Статическое приложение QT

161
16 ноября 2018, 15:10

Установил статический QT по видео. Установил QWT по видео.
В файле C:\qwt-6.1.3\qwtconfig.pri закоменчена строка:

######################################################################
# Build the static/shared libraries.
# If QwtDll is enabled, a shared library is built, otherwise
# it will be a static library.
######################################################################
#QWT_CONFIG           += QwtDll

Создаю маленький проект(код ниже). Динамически все собирается и запускается. Статически собирается, но вылетает ошибка:

QWidget: Must construct a QApplication before a QWidget


Путь к статик Qt: C:\Qt\Static5111\5.11.1_Static Путь к Qwt: C:\qwt-6.1.3 Проект: qwtTemp.pro

QT       += core gui widgets
TARGET = qwtTemp
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS

CONFIG += c++11
SOURCES += \
        main.cpp \
        widget.cpp
HEADERS += \
        widget.h

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
CONFIG += qwt

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <qwt_plot.h>
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = 0);
    ~Widget();
    QwtPlot *p;
};
#endif // WIDGET_H

widget.cpp

#include "widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    p = new QwtPlot();
}
Widget::~Widget()
{
    delete p;
}

main.cpp

#include "widget.h"
#include <QApplication>
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    w.p->show();
    return a.exec();
}

Обычная сборка "Отладка"

Обычная сборка "Выпуск"

Статическая сборка "Отладка"

Статическая сборка "Выпуск"

QWidget: Must construct a QApplication before a QWidget
09:37:22: C:/Users/User_ggsk_1/Documents/build-qwtTemp-Desktop_QtStatic_5_11_1_MinGW_32bit-Release/release/qwtTemp завершился с кодом 3

Answer 1

Вероятнее всего эта проблема инициирована различными условиями компиляции библиотеки и самой программы. Библиотеки так же надо компилировать в режиме отладки, если приложение собираеться в debug режиме. Несоблюдение этого соглашения обычно приводит к неопределенному поведению.

Собирайте библиотеки сразу в двух видах, отладочный и режим релиза, если это можно так назвать, без debug символов.

Так же, библиотеки в отладочном режиме обычно отличаются по имени от релиза, например:

  • QGLViewerd2.lib - дебаг версия
  • QGLViewer2.lib - релиз версия

суффикс d присутствует в сборке с режимом отладки. Соответственно надо менять привязки библиотек в MSVC, на нужное имя в зависимости от сборки.

Или использовать pragma в коде для автоматического выбора библиотек, например:

#if defined __DEBUG__
#pragma comment (lib, "QGLViewerd2.lib")
#else
#pragma comment (lib, "QGLViewer2.lib")
#endif
READ ALSO
Как решить ошибку отладки?( vector subscript out of range)

Как решить ошибку отладки?( vector subscript out of range)

Возможно неправильно что-то сделал с вектором структур, первый раз с таким работаю`Помогите пожалуйста, если знаете в чём дело)

155
Задача про улитку

Задача про улитку

Улитка ползет по вертикальному шесту высотой H метров, поднимаясь за день на A метров, а за ночь спускаясь на B метровНа какой день улитка доползет...

163
Состояние гонки данных

Состояние гонки данных

Есть ли что-то "опасное" в том, что два потока будут одновременно инкрементировать одну переменную? Я имею ввиду, может ли произойти такое,...

203