QT - konfiguracja qmake

Zakładam, że osoba czytająca ten artykuł posiada już podstawowe wiadomości z dziedziny programowania w języku C++.
Należy wiedzieć co to są pliki nagłówkowe i pliki źródłowe oraz który plik jest plikiem głównym, itp.}}

W naszym folderze roboczym (czyli tam gdzie mamy ładnie posegregowane swoje programy) zakładamy nowy folder qmake-learning

kris@sphinx:~/workspace> mkdir qmake-learning

Przechodzimy do tego folderu:

kris@sphinx:~/workspace> cd qmake-learning/

kris@sphinx:~/workspace/qmake-learning>

Zakładamy nowe pliki hello.cpp:

kris@sphinx:~/workspace/qmake-learning>emacs hello.cpp

W pliku źródłowym hello.cpp umieszczamy:

#include <QApplication>
#include <QPushButton>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);
    QPushButton hello(QPushButton::tr("Hello world!"));
    hello.resize(100, 30);
    hello.show();
    return app.exec(); 
}

oraz hello.pro

kris@sphinx:~/workspace/qmake-learning> emacs hello.pro

W pliku konfiguracyjnym hello.pro naszego programu umieszczamy:

SOURCES += hello.cpp

Konfiguracja pliku pro

Nazwa pliku wykonywalnego ustawiona jest automatycznie dostosowana do nazwy pliku *.pro, więc w tym wypadku skoro plik *.pro nazywał się "hello" więc również plik wykonywalny będzie nazywał się "hello".
Ale jeśli z jakichś względów nie odpowiada nam to, więc możemy zmienić te ustawienia w sekcji TARGET, np. na helloworld

SOURCES = hello.cpp

TARGET = helloworld

Ostatnim krokiem jest ustawienie zmiennej CONFIG:

CONFIG += qt

SOURCES += hello.cpp

TARGET = helloworld

Jeśli program skompilujemy w tradycyjny sposób:

kris@sphinx:~/workspace/qmake-learning> qmake -project

 kris@sphinx:~/workspace/qmake-learning> qmake

 kris@sphinx:~/workspace/qmake-learning> make

 g++ -c -pipe -O2 -fomit-frame-pointer -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector 
 -funwind-tables  -fasynchronous-unwind-tables -g -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_GUI_LIB 
 -DQT_CORE_LIB -DQT_SHARED  -I/usr/share/qt4/mkspecs/default -I. -I/usr/include/QtCore -I/usr/include/QtGui 
 -I/usr/include -I. -I. -o hello.o  hello.cpp g++ -Wl,-O1 -o qmake-learning hello.o -L/usr/lib -lQtGui -L/usr/lib 
 -L/usr/X11R6/lib -lQtCore -lpthread

to w wyniku otrzymamy pliki:

kris@sphinx:~/workspace/qmake-learning> ll

razem 272
-rw-r--r-- 1 kris users    247 04-07 11:49 hello.cpp
-rw-r--r-- 1 kris users 136572 04-07 11:55 hello.o
-rw-r--r-- 1 kris users     56 04-07 11:50 hello.pro
-rw-r--r-- 1 kris users   6761 04-07 11:55 Makefile
-rwxr-xr-x 1 kris users 118269 04-07 11:55 qmake-learning
-rw-r--r-- 1 kris users    298 04-07 11:55 qmake-learning.pro

gdzie plikiem wynikowym jest qmake-learning. Lecz naszym celem był plik wynikowy helloworld, który to zdefiniowaliśmy w sekcji TARGET
Więc spróbujemy inaczej:

kris@sphinx:~/workspace/qmake-learning> qmake -project

kris@sphinx:~/workspace/qmake-learning>  qmake -o Makefile hello.pro

kris@sphinx:~/workspace/qmake-learning> make

g++ -c -pipe -O2 -fomit-frame-pointer -fmessage-length=0 -O2 -Wall -D_FORTIFY_SOURCE=2 -fstack-protector 
-funwind-tables -fasynchronous-unwind-tables -g -D_REENTRANT -Wall -W -DQT_NO_DEBUG -DQT_GUI_LIB 
-DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/default -I. -I/usr/include/QtCore -I/usr/include/QtGui 
-I/usr/include -I. -o hello.o hello.cpp g++ -Wl,-O1 -o helloworld hello.o -L/usr/lib -lQtGui -L/usr/lib 
-L/usr/X11R6/lib -lQtCore -lpthread

W ten sposób otrzymaliśmy zamierzony cel, czyli plik wynikowy helloworld:

kris@sphinx:~/workspace/qmake-learning> ll
razem 272
-rw-r--r-- 1 kris users    247 04-07 11:49 hello.cpp
-rw-r--r-- 1 kris users 136572 04-07 11:53 hello.o
-rw-r--r-- 1 kris users     56 04-07 11:50 hello.pro
-rwxr-xr-x 1 kris users 118269 04-07 11:53 helloworld
-rw-r--r-- 1 kris users   6647 04-07 11:53 Makefile
-rw-r--r-- 1 kris users    298 04-07 11:52 qmake-learning.pro

Pliki nagłówkowe

Jeśli w projekcie istnieją pliki nagłówkowe, to dodajemy je w następujący sposób:

HEADERS += hello.h

lub też na przykład jeśli wolisz używać innej składni, to zamiast wymieniać wszystkie pliki od nowej lini, to możesz zastosować poniższą składnię:

SOURCES = hello.cpp \
           main.cpp

HEADERS += hello.h \
           innypliknaglowkowy.h

Debugowanie

Aby skorzystać z opcji debugowania projektu dopiszmy słowo debug w sekcji CONFIG:

CONFIG += qt debug
HEADERS += hello.h
SOURCES += hello.cpp

Przenośność kodu

Aby nasz program był przenośny na inne systemy operacyjne musimy dodać nowe sekcje win32 oraz unix:

CONFIG += qt debug

SOURCES += hello.cpp

win32 {
     SOURCES += hellowin.cpp
}

unix {
     SOURCES += hellounix.cpp
}

gdzie pliki hellowin.cpp oraz hellounix.cpp są przystosowane kolejno do systemów Windows oraz Unix

Sprawdzenie czy dany plik istnieje

Aby sprawdzić, czy dany plik istnieje w projekcie posłużymy się opcją exists. Od tej pory nasz plik hello.pro będzie wyglądał w następujący sposób:

CONFIG += qt debug
SOURCES += hello.cpp
!exists( main.cpp ) {
     error( "Plik main.cpp nie został znaleziony!" )
}

Spróbujmy skompilować ponownie nasz projekt:

kris@sphinx:~/workspace/qmake-learning> qmake -project

 kris@sphinx:~/workspace/qmake-learning> qmake -o Makefile hello.pro
 Project ERROR: Plik main.cpp nie został znaleziony!

Super. Wszystko działa tak jak należy.

Sprawdzanie więcej niż jednego warunku

Załóżmy, że używasz systemu Windows i chcesz zobaczyć wyjście qDebug () podczas uruchamiania aplikacji w wierszu poleceń.
Aby tego dokonać posłuż się sekcją:

win32 {
     debug {
         CONFIG += console
     }
}

lub też tą samą sekcją napisaną w inny sposób:

win32:debug {
     CONFIG += console
}

Inne wiadomości

Artykuł ten został również zamieszczony również na wiki opensuse: wiki.suse.pl