опять Qt (Debian Etch)

Модератор: Модераторы разделов

godima
Сообщения: 92
ОС: Debian Etch

опять Qt

Сообщение godima »

Всем доброго времени!
Мне довольно стыдно обращаться с избитыми вопросами, но конкретики так и не могу найти (поиск по форуму и по google делал)... поэтому не судите строго, пожалуйста.
мне нужно сделать программу обработки изображений с графическим интерфейсом. Я в основном прогаю на скриптовых языках типа Ruby, с C++ знаком не очень много, но чтобы сделать обработку - знаний хватит. Раз уж писать на С++, то все приложение :)
Хочу использовать Qt4 для построения графического интерфейса пользователя, а так же для загрузки изображений в основную программу (типа разбиение по слоям)
Почитал доки - в принципе все ясно.
Не ясно только то, что до этого на С++ никогда в Линукс программы не писал :(
А теперь вопросы :)
1. Подскажите, пожалуйста, где найти доки (а может и вы мне кратко ответите), как делаются приложения под Линукс на С++? Хочу использовать qmake, и на сколько я понял, мы сначала пишем исходные файлы проекта, потом делаем qmake -project в текущей папке, потом qmake, потом make - и получаем готовое приложение в каталоге, прописанном в make-файле. Этот подход годится для сколь-угодно больших приложений?
2. Какие инструменты использовать для создания установочного файла для готового приложения?
3. А теперь про Qt :)
Делаю простейшую программу из примеров (Hello World именуется) с таким кодом:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QPushButton hello("Hello world!");
hello.resize(100, 30);

hello.show();
return app.exec();
}

вывод make таков

main.cpp:1:25: error: QApplication: No such file or directory
main.cpp:2:24: error: QPushButton: No such file or directory

Не ясно, в линукс С++ не понимает что ли заголовочные файлы без .h ?
опытным путем правим до такого состояния:
#include <qapplication.h>
#include <qpushbutton.h>

int main(int argc, char *argv[])
{
QApplication app(argc, argv);

QPushButton hello("Hello world!");
hello.resize(100, 30);

hello.show();
return app.exec();
}

ладно, что .h добавили, но нужно еще и буквы строчными сделать... ПОЧЕМУ ТАК? и как-то это можно поправить?
Выдает программа такой вывод:
main.cpp:13:3: warning: no newline at end of file
main.cpp: In function ‘int main(int, char**)’:
main.cpp:8: error: no matching function for call to ‘QPushButton::QPushButton(const char [13])’
/usr/include/qt3/qpushbutton.h:138: note: candidates are: QPushButton::QPushButton(const QPushButton&)
/usr/include/qt3/qpushbutton.h:67: note: QPushButton::QPushButton(const QIconSet&, const QString&, QWidget*, const char*)
/usr/include/qt3/qpushbutton.h:65: note: QPushButton::QPushButton(const QString&, QWidget*, const char*)
/usr/include/qt3/qpushbutton.h:64: note: QPushButton::QPushButton(QWidget*, const char*)
make: *** [main.o] Ошибка 1

И что делать? Я реально не понимаю, так как это моя первая программа на линукс

И еще, не ругайтесь, пожалуйста, если вопросы очевидные для Вас, если что-то толковое почитать дадите именно по методологии и методике построения приложений под линукс буду рад!
А если на вопросы ответите, хотя бы кратко, буду безмерно благодарен!!!!

Заранее всем спасибо!
Спасибо сказали:
Аватара пользователя
k01
Сообщения: 104
ОС: Archlinux

Re: опять Qt

Сообщение k01 »

#include <QApplication>

для Qt4 здесь всё нормально

/usr/include/qt3/qpushbutton.h:138: note: candidates are: QPushButton::QPushButton(const QPushButton&)

просто вы создали проект при помощи qmake от Qt3 ;)
попробуйте при запуске qmake указать полный путь т.е. <директория где стоит qt4>/bin/qmake
Рациональное программирование — наш ответ MicroSoft!
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: опять Qt

Сообщение v04bvs »

Для компиляции Qt-шных программ обычно используются Qt-шные средства. Для проекта пишется .pro файл, после этого qmake его преобразует в Makefile, который уже используется обычным make-ом. qmake -project генерирует .pro файл на основе файлов, которые лежат в текущем каталоге, но вообще говоря я бы рекомендовал pro файлы писать руками, это совсем не сложно.

Для создания "установочного" файла - не понятно, что имеется в виду. .deb или .rpm пакет - читать документацию, .tar.bz2 - архив с исходным текстом.
Спасибо сказали:
godima
Сообщения: 92
ОС: Debian Etch

Re: опять Qt

Сообщение godima »

v04bvs писал(а):
07.06.2007 22:04
Для компиляции Qt-шных программ обычно используются Qt-шные средства. Для проекта пишется .pro файл, после этого qmake его преобразует в Makefile, который уже используется обычным make-ом. qmake -project генерирует .pro файл на основе файлов, которые лежат в текущем каталоге, но вообще говоря я бы рекомендовал pro файлы писать руками, это совсем не сложно.

Для создания "установочного" файла - не понятно, что имеется в виду. .deb или .rpm пакет - читать документацию, .tar.bz2 - архив с исходным текстом.


.pro - на самом деле не сложно :) и в доках написано как делается, я здесь самый простой вариант для примера сделал :)
но за совет все равно спасибо!

k01 писал(а):
07.06.2007 21:51
#include <QApplication>

для Qt4 здесь всё нормально

/usr/include/qt3/qpushbutton.h:138: note: candidates are: QPushButton::QPushButton(const QPushButton&)

просто вы создали проект при помощи qmake от Qt3 ;)
попробуйте при запуске qmake указать полный путь т.е. <директория где стоит qt4>/bin/qmake


а что мне тогда сделать, чтобы по умолчанию сделался путь для qmake из qt4?
Спасибо сказали:
godima
Сообщения: 92
ОС: Debian Etch

Re: опять Qt

Сообщение godima »

v04bvs писал(а):
07.06.2007 22:04
Для компиляции Qt-шных программ обычно используются Qt-шные средства. Для проекта пишется .pro файл, после этого qmake его преобразует в Makefile, который уже используется обычным make-ом. qmake -project генерирует .pro файл на основе файлов, которые лежат в текущем каталоге, но вообще говоря я бы рекомендовал pro файлы писать руками, это совсем не сложно.

Для создания "установочного" файла - не понятно, что имеется в виду. .deb или .rpm пакет - читать документацию, .tar.bz2 - архив с исходным текстом.


А ведь, блин, действительно помогло! Спасибо Вам!
Почитать может что-то посоветуете по разработке приложений под линукс, или больше подобного рода камешков не будет? :)
Ну и в силе остается вопрос, как теперь установить qmake из Qt4 по умолчанию вместо qmake из Qt3?

Спасибо!
Спасибо сказали:
Аватара пользователя
k01
Сообщения: 104
ОС: Archlinux

Re: опять Qt

Сообщение k01 »

а что мне тогда сделать, чтобы по умолчанию сделался путь для qmake из qt4?

можно указать в переменной окружения PATH : export PATH=<путь к QT4>/bin:$PATH
можно сделать ссылку на qmake в /usr/bin : ln -s <qmake4> /usr/bin/qmake
Рациональное программирование — наш ответ MicroSoft!
Спасибо сказали:
godima
Сообщения: 92
ОС: Debian Etch

Re: опять Qt

Сообщение godima »

v04bvs писал(а):
07.06.2007 22:04
Для компиляции Qt-шных программ обычно используются Qt-шные средства. Для проекта пишется .pro файл, после этого qmake его преобразует в Makefile, который уже используется обычным make-ом. qmake -project генерирует .pro файл на основе файлов, которые лежат в текущем каталоге, но вообще говоря я бы рекомендовал pro файлы писать руками, это совсем не сложно.

Для создания "установочного" файла - не понятно, что имеется в виду. .deb или .rpm пакет - читать документацию, .tar.bz2 - архив с исходным текстом.


Ну под установочным файлом имеется в виду некое подобие виндовых программ - дал пользователю пакет (rpm, или deb - не важно), он у себя его поставил и радуется :)
Но хотя Вы правы - это, вероятно, к документации :)
Спасибо за совет

k01 писал(а):
07.06.2007 22:29
а что мне тогда сделать, чтобы по умолчанию сделался путь для qmake из qt4?

можно указать в переменной окружения PATH : export PATH=<путь к QT4>/bin:$PATH
можно сделать ссылку на qmake в /usr/bin : ln -s <qmake4> /usr/bin/qmake

Пасибо! Помогло :)
Спасибо сказали:
Abaddon
Сообщения: 81
ОС: Gentoo 2006.1.x86_64

Re: опять Qt

Сообщение Abaddon »

godima писал(а):
07.06.2007 22:34
Ну под установочным файлом имеется в виду некое подобие виндовых программ - дал пользователю пакет (rpm, или deb - не важно), он у себя его поставил и радуется :)
Но хотя Вы правы - это, вероятно, к документации :)
Спасибо за совет

Если собирается бинарный пакет, то действительно, к документации
Если Имеется ввиду графическая инсталяция - видимо писать самому, либо попробовать найти на Поисковик по разным прогам
Если пакет поставляется в виде исходников, и предполагается использование make install, то снова отправляю к документации, на сей раз к qassistent, в раздел qmake, там очень подробно описаны переменные, и даны примеры, как их использовать.

Естественно, что последний вариант наиболее предпочтительный, тк обеспечит более гибкую поддержку разных дистрибутивов.
На всякий случай даю пару файлов, с разъяснениями:

Код: Выделить всё

#Здесь, думаю все понятно
HEADERS += cMainWindow.h \
                  ...
        cFileEditorTabs.h
SOURCES += cMainWindow.cpp \
                 ...
                 main.cpp
#Шаблон сборки: приложение
TEMPLATE = app
#Конфигурация сборки
#CONFIG += release
CONFIG += debug \
warn_on \
thread \
qt
#Какие еще модули использует програма
QT+=network
#Цель сборки
TARGET = ./bin/szpl
#Где его собирать
#Куда класть MOC-файлы
MOC_DIR=./build
#Куда класть объектные файлы
OBJECTS_DIR=./build
#Свои пути для инклудов, чтобы в исходниках указывать только имена файлов:)
INCLUDEPATH+=./ ../../global ../../common ../clientcore ../../
#Используемые библиотеки и пути к ним
LIBS+=-L../clientcore/bin -l szpl_clientcore -L../../common/bin -lszpl_common -ldbxml -lxerces-c -ldb -lxquery -ldb_cxx -lpathan
#PRE_TARGETDEPS+=../modules/lib/bin/libszpl_modules.a
#Зависимости от прочих библиотек, в виду того, что код программы может не меняться, а библиотека может поправится, действие необходимо (при изменении содержимого либы, линкер пересоберет и основную программу)
PRE_TARGETDEPS+=../../common/bin/libszpl_common.so
PRE_TARGETDEPS+=../clientcore/bin/libszpl_clientcore.so

И еще кусочек одного

Код: Выделить всё

#Собираем библиотеку
TEMPLATE = lib
#Цель сборки
TARGET = bin/szpl_clientcore
#Куда ставить
target.path=/usr/lib
#Что ставить
INSTALLS+=target


Да, кстати, при использовании иерархии каталогов, имена *.pro файлов должны соответствовать именам каталогов, иначе qmake может их не найти

Код: Выделить всё

#Создать маке и в этих каталогах
SUBDIRS += db_records
SUBDIRS += clientcore
SUBDIRS += modules
SUBDIRS += main
TEMPLATE = subdirs
CONFIG += debug \
          warn_on \
          qt \
          thread

Удачи в бою
Base: Gentoo 2006.1.x86_64 on AMD64_X2-5200+/1024Mb/7300GS-256Mb/250Gb
Serv: Gentoo 2006.1.x86_32 on iCeleron-2.4/1024Mb/Geforce2MX400-64Mb/250Gb+60Gb
Note: Gentoo 2006.1.x86_32 on Transmeta-8800(Efficeon)/512Mb/(Trident-???)/40Gb
Gate: Gentoo 2005.1.x86_32 on AMD-K6.2-500/64Mb/forgot.../3.2Gb+6.4Gb+40Gb
Спасибо сказали:
godima
Сообщения: 92
ОС: Debian Etch

Re: опять Qt

Сообщение godima »

Abaddon писал(а):
07.06.2007 23:36
godima писал(а):
07.06.2007 22:34
Ну под установочным файлом имеется в виду некое подобие виндовых программ - дал пользователю пакет (rpm, или deb - не важно), он у себя его поставил и радуется :)
Но хотя Вы правы - это, вероятно, к документации :)
Спасибо за совет

Если собирается бинарный пакет, то действительно, к документации
Если Имеется ввиду графическая инсталяция - видимо писать самому, либо попробовать найти на Поисковик по разным прогам
Если пакет поставляется в виде исходников, и предполагается использование make install, то снова отправляю к документации, на сей раз к qassistent, в раздел qmake, там очень подробно описаны переменные, и даны примеры, как их использовать.

Естественно, что последний вариант наиболее предпочтительный, тк обеспечит более гибкую поддержку разных дистрибутивов.
На всякий случай даю пару файлов, с разъяснениями:

Код: Выделить всё

#Здесь, думаю все понятно
HEADERS += cMainWindow.h \
                  ...
        cFileEditorTabs.h
SOURCES += cMainWindow.cpp \
                 ...
                 main.cpp
#Шаблон сборки: приложение
TEMPLATE = app
#Конфигурация сборки
#CONFIG += release
CONFIG += debug \
warn_on \
thread \
qt
#Какие еще модули использует програма
QT+=network
#Цель сборки
TARGET = ./bin/szpl
#Где его собирать
#Куда класть MOC-файлы
MOC_DIR=./build
#Куда класть объектные файлы
OBJECTS_DIR=./build
#Свои пути для инклудов, чтобы в исходниках указывать только имена файлов:)
INCLUDEPATH+=./ ../../global ../../common ../clientcore ../../
#Используемые библиотеки и пути к ним
LIBS+=-L../clientcore/bin -l szpl_clientcore -L../../common/bin -lszpl_common -ldbxml -lxerces-c -ldb -lxquery -ldb_cxx -lpathan
#PRE_TARGETDEPS+=../modules/lib/bin/libszpl_modules.a
#Зависимости от прочих библиотек, в виду того, что код программы может не меняться, а библиотека может поправится, действие необходимо (при изменении содержимого либы, линкер пересоберет и основную программу)
PRE_TARGETDEPS+=../../common/bin/libszpl_common.so
PRE_TARGETDEPS+=../clientcore/bin/libszpl_clientcore.so

И еще кусочек одного

Код: Выделить всё

#Собираем библиотеку
TEMPLATE = lib
#Цель сборки
TARGET = bin/szpl_clientcore
#Куда ставить
target.path=/usr/lib
#Что ставить
INSTALLS+=target


Да, кстати, при использовании иерархии каталогов, имена *.pro файлов должны соответствовать именам каталогов, иначе qmake может их не найти

Код: Выделить всё

#Создать маке и в этих каталогах
SUBDIRS += db_records
SUBDIRS += clientcore
SUBDIRS += modules
SUBDIRS += main
TEMPLATE = subdirs
CONFIG += debug \
          warn_on \
          qt \
          thread

Удачи в бою


Спасибо Вам за понимание и терпеливость в объяснении
Спасибо сказали: