Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: finka от Октябрь 04, 2007, 13:55



Название: Qwt myPlot
Отправлено: finka от Октябрь 04, 2007, 13:55
Я установила Qwt в варианте debug/release, но debug вариант у меня не работает. С грехом пополам работает release, если qwt5.dll засунуть в ту же директорию, что и проект, и если еще создать .pri файл следующего содержания
Код:
# -*- mode: sh -*- ################################################
# Qwt Widget Library
# Copyright (C) 1997   Josef Wilgen
# Copyright (C) 2002   Uwe Rathmann
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the Qwt License, Version 1.0
###################################################################

include( ../../../../../Qt/qwt-5.0.2/qwtconfig.pri )

TEMPLATE     = app

MOC_DIR      = moc
OBJECTS_DIR  = obj
INCLUDEPATH += ../../../../../Qt/qwt-5.0.2/src
DEPENDPATH  += ../../../../../Qt/qwt-5.0.2/src

unix:LIBS        += -L../../lib -lqwt

win32:QwtDll {
    DEFINES    += QT_DLL QWT_DLL
}

contains(CONFIG, QwtDll) {
    win32-msvc:LIBS  += ../../../../../Qt/qwt-5.0.2/lib/qwt5.lib
    win32-msvc.net:LIBS  += ../../../../../Qt/qwt-5.0.2/lib/qwt5.lib
    win32-msvc2005:LIBS += ../../../../../Qt/qwt-5.0.2/lib/qwt5.lib
    win32-g++:LIBS   += -L../../../../../Qt/qwt-5.0.2/lib -lqwt
} else {
    win32-msvc:LIBS  += ../../../../../Qt/qwt-5.0.2/lib/qwt.lib
    win32-msvc.net:LIBS  += ../../../../../Qt/qwt-5.0.2/lib/qwt.lib
    win32-msvc2005:LIBS += ../../../../../Qt/qwt-5.0.2/lib/qwt.lib
    win32-g++:LIBS   += -L../../../../../Qt/qwt-5.0.2/lib -lqwt
}

и этот файл подключить в .pro файле. Извращение какое-то, но иначе не получилось.
Но вопрос даже не в этом, а вот в чем. Я создаю Plot, потомок от QwtPlot, при следующей конструкции
Plot * plot = new Plot(); программа вылетает (так как у меня работает только debig вариант qwt, конкретную строчку найти не могу, из конструктора программа выходит и даже успевает вывести следующее за этой строчкой сообщение). Конструктор у Plot такой:
Код:
Plot::Plot():QwtPlot(){все закомментировано нафиг}
пробовала также такой:
Код:
Plot::Plot(){все закомментировано нафиг}
Но ничего не изменилось.
Причем объявление без указателя, то есть
Plot plot
работает, но так plot становится локальной переменной и удаляется при выходе из функции, чего мне совершенно не нужно.
Да, и еще
QwtPlot * plot = new QwtPlot() работает, график рисуется, и все там нормально работает.


Название: Re: Qwt myPlot
Отправлено: yanchick от Октябрь 04, 2007, 15:42
По поводу вылета проги, у меня подобный геморр был при динамической линковки qwt, после перехода на статическую линковку косяк исчез.


Название: Re: Qwt myPlot
Отправлено: alex12 от Октябрь 04, 2007, 16:37
Код:
Plot * plot = new Plot();
В таком виде plot -- локальная переменная-указатель и удаляется при выходе из функции.

Нужно:
Код:
Plot * plot;
объявить как переменную класса, а при создании:
Код:
plot = new Plot();

Еще про .pri: Странно, что он такой сложный. У меня все получилось гораздо проще. Если интересно я напишу подробности.


Название: Re: Qwt myPlot
Отправлено: finka от Октябрь 04, 2007, 17:17
alex12 , при выходе из функции удалается указатель, а сам объект - нет. Предложенный вариант с переменной класса работает так же, как и мой - программа вылетает сразу после вызова конструктора. Интересно:)


Название: Re: Qwt myPlot
Отправлено: alex12 от Октябрь 04, 2007, 17:52
А Plot сделан такой конструкцией ?
Код:
class Plot : public QwtPlot
{
  Q_OBJECT
public:
  Plot( QWidget *parent = 0 );
};
Код:
Plot::Plot(QWidget *parent )
  : QwtPlot( parent )
{
}

Попробуй посмотреть и пособирать примеры из Qwt.

Может это сбой компилятора/линкера? Иногда помограет полная пересборка проекта make clean && make


Название: Re: Qwt myPlot
Отправлено: ритт от Октябрь 04, 2007, 18:41
посмею предположить, что сборка под виндой с мингвом

была такая же проблема при наследовании классов iiSystem VB
решается 1.статической компоновкой; 2.указанием импорта/экспорта для класса-родителя и т.д.


Название: Re: Qwt myPlot
Отправлено: finka от Октябрь 04, 2007, 18:45
alex12 , да, конструкция такая.
Qt4.3.1-VS2005


Название: Re: Qwt myPlot
Отправлено: alex12 от Октябрь 04, 2007, 19:08
А примеры из Qwt нормально собираются?
Там, например, "bode" сделан также.

Насчет динамической/статической сборки: у меня 4.3.X + MinGW + динамическая Qwt и все OK.

Единственное, я для упрощения Qwt5.dll кидаю в QTDIR/bin, а Qwt5.a кидаю в QTDIR/lib.
Кроме этого в QTDIR/include создаю Qwt и копирую туда *.h от Qwt.
После этого в .pro нудно добавить только:
Код:
INCLUDEPATH +=$$[QT_INSTALL_PREFIX]/include/Qwt
LIBS += -lqwt






Название: Re: Qwt myPlot
Отправлено: SLiDER от Октябрь 04, 2007, 19:33
При работе с Qwt важно линковать debug/release сборку библиотеки к debug/release сборке вашей программы соответственно, иначе вылетов не избежать. Я не знаю как там сейчас, а когда я последний раз собирал Qwt, в pro-файле небыло правил сборки для debug и release одновременно, я их сам дописывал, чтобы собирались сразу обе версии и чтобы debug-версия была с буковкой d на конце, в такой ситуации точно не запутаешся. 8)


Название: Re: Qwt myPlot
Отправлено: alex12 от Октябрь 04, 2007, 19:54
Кстати, правда все дело может быть в debug/release. Я debug'ом-то никогда не пользуюсь...  ;)


Название: Re: Qwt myPlot
Отправлено: ритт от Октябрь 04, 2007, 21:31
Единственное, я для упрощения Qwt5.dll кидаю в QTDIR/bin, а Qwt5.a кидаю в QTDIR/lib.
Кроме этого в QTDIR/include создаю Qwt и копирую туда *.h от Qwt.
После этого в .pro нудно добавить только:
Код:
INCLUDEPATH +=$$[QT_INSTALL_PREFIX]/include/Qwt
LIBS += -lqwt

ещё лучше/проще набить фичу и в .pro:
Код:
CONFIGURE *= qwt


Название: Re: Qwt myPlot
Отправлено: finka от Октябрь 05, 2007, 13:05
А подскажите, как сделать компоновку статической ::)


Название: Re: Qwt myPlot
Отправлено: finka от Октябрь 05, 2007, 13:08
Еще один умный вопрос:
xep , что подразумевается под указанием импорта/экспорта класса-родителя и тд?


Название: Re: Qwt myPlot
Отправлено: ритт от Октябрь 05, 2007, 17:17
Код:
#include <QtGlobal>

#ifdef Q_OS_WIN
#ifdef CORELIB_BUILD
#define CUSTOM_EXPORT Q_DECL_EXPORT
#else
#define CUSTOM_EXPORT Q_DECL_IMPORT
#endif
#endif
#ifndef CUSTOM_EXPORT
#define CUSTOM_EXPORT
#endif

class CUSTOM_EXPORT SomeClass ...

примерно так.
с вб помогло в своё время (но не факт, что проблема была в этом :))


Название: Re: Qwt myPlot
Отправлено: KADABRA от Октябрь 05, 2007, 21:26
Как раз недавно использовал qwt, соответственно и собирал.
Что примечательного заметил - то что собирается только релиз версии длл-ек и либ.
Чтобы собрать дебаг версии приходится руками править мейкфайл.


Название: Re: Qwt myPlot
Отправлено: SLiDER от Октябрь 05, 2007, 22:17
Как раз недавно использовал qwt, соответственно и собирал.
Что примечательного заметил - то что собирается только релиз версии длл-ек и либ.
Чтобы собрать дебаг версии приходится руками править мейкфайл.

Зачем makefile-то править, когда проще pro-файл подправить? Добавить в него
Код:
CONFIG += debug_and_release
для того чтобы собирались сразу обе версии библиотеки, и еще
Код:
CONFIG(debug, debug|release) {
unix: TARGET = $$join(TARGET,,,_debug)
else: TARGET = $$join(TARGET,,d)
}
чтобы названия release-версии от debug-версии отличались. Ибудет вам счастие великое.  ;)


Название: Re: Qwt myPlot
Отправлено: KADABRA от Октябрь 06, 2007, 18:36
чтобы названия release-версии от debug-версии отличались. Ибудет вам счастие великое.  ;)
Ну, вот это я как раз в мейкфайле правил :)


Название: Re: Qwt myPlot
Отправлено: finka от Октябрь 10, 2007, 18:40
Я созрела для того, чтобы переустановить qwt в debug_and_release варианте. Последовательность моих действий:
добавила в qwt.pro строчку:
Код:
CONFIG += debug_and_release
добавила в qwtconfig.pri строчки:
CONFIG(debug, debug|release) {
unix: TARGET = $$join(TARGET,,,_debug)
else: TARGET = $$join(TARGET,,d)
}
далее
Код:
qmake qwt.pro
nmake
cd examples
qmake examples.pro
nmake
cd ../admin
msvc-qmake vc"
Потом засунула qwt5.dll в qt/bin, а qwt5.lib в qt/lib. Почему-то собралась только дебаг версия примеров:( Примеры работают, а ворнинг такой: MSVCRTD.lib(cinitexe.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
Почему у меня не собрались release версии примеров? Может я опять как-то не так собрала qwt???


Название: Re: Qwt myPlot
Отправлено: finka от Октябрь 10, 2007, 18:53
В  vs собрала release версию примеров radio и bode. экзешники создаются но не запускаются:
Код:
Debug Error!
Program: путь к экзешнику
Module: 4.3.1
File: global\qglobal.cpp
Line: 2152
QWidget: Must construct a QApplication before a QPaintDevice
Ну и тот же ворнинг естественно.


Название: Re: Qwt myPlot
Отправлено: SLiDER от Октябрь 10, 2007, 19:53
Не, не так.

1. В файле qwtconfig.pri заменяете строчку

Код:
CONFIG           += release     # release/debug

на строчку

Код:
CONFIG           += debug_and_release     # release/debug

2. В файл src\src.pro добавляете следующий код

Код:
CONFIG(debug, debug|release) {
unix: TARGET = $$join(TARGET,,,_debug)
else: TARGET = $$join(TARGET,,d)
}

например, сразу после строчки

Код:
DESTDIR           = ../lib

3. Собираете все это, и получаете полный комплект dll и lib файлов debug (с постфиксом d) и release версий.

4. Пишите хорошие и красивые программы.  :)


Название: Re: Qwt myPlot
Отправлено: ритт от Октябрь 10, 2007, 20:15
только что пересобрал либу, проверил все примеры - ни разу ни одного даже ворнинга
если и с использованием подсказки выше победить не удастся, переходите на гцц :)


Название: Re: Qwt myPlot
Отправлено: Tonal от Октябрь 10, 2007, 20:38
Очевидно не совпадают настройки рантаймов статика/динамика одно/много поточность.


Название: Re: Qwt myPlot
Отправлено: finka от Октябрь 11, 2007, 11:11
SLiDER ,
1) у меня так и было
2) исправила
3)
Код:
qmake qwt.pro
nmake
link fatal error: cannot open input file '../lib.qwt5.lib'
В папке lib присутствуют только dqwt5.lib (.dll), а release версий qwt5 нет совсем:(
ЗЫ: и еще собирается с кучей ворнингов типа "... no suitable definition provided for explicit template instantiation request with [ T = qreal]"


Название: Re: Qwt myPlot
Отправлено: finka от Октябрь 11, 2007, 11:41
Да, и еще - если просто += release, то release-версия собирается.


Название: Re: Qwt myPlot
Отправлено: SLiDER от Октябрь 11, 2007, 18:57
SLiDER ,
1) у меня так и было
2) исправила
3)
Код:
qmake qwt.pro
nmake
link fatal error: cannot open input file '../lib.qwt5.lib'
В папке lib присутствуют только dqwt5.lib (.dll), а release версий qwt5 нет совсем:(
ЗЫ: и еще собирается с кучей ворнингов типа "... no suitable definition provided for explicit template instantiation request with [ T = qreal]"

И всетаки у вас было не совсем так (вы редактировали не src.pro). Похоже что вы в qwtconfig.pri раскоментировали строчку для сборки примеров, так вот линкер не может найти release-версию библиотеки, так как она еще не собрана, судя по всему. Наберите вместо nmake, nmake Release. Кстати вот это -> dqwt5.lib опечатка или библиотека так назвалась при сборке? Вообщето должно было быть qwt5d.lib.  ???

З.Ы. На эти ворнинги не обращайте внимания, это компилятор Visual Studio не очень хорошо понимает С++.  ;D Шутка.


Название: Re: Qwt myPlot
Отправлено: finka от Октябрь 12, 2007, 15:02
Не опечатка, так и назвалась.


Название: Re: Qwt myPlot
Отправлено: SLiDER от Октябрь 12, 2007, 19:23
Не опечатка, так и назвалась.

Эмммм, попробуйте вот здесь

Код:
else: TARGET = $$join(TARGET,,d)

запятую добавить, вот так

 
Код:
else: TARGET = $$join(TARGET,,,d)