2009-09-13 17 views
59

Zaczynam się uczyć Qt. Przeprowadzam się ze świata Visual Studio i szukam sposobu na uporządkowanie struktury mojego projektu za pomocą QMake. Znalazłem szablon "subdirs", ale mam go dość trudno zrozumieć.Jak korzystać z szablonu podkatalogów QMake?

Moja struktura projektu wygląda następująco:

project_dir/ 
    main.cpp 
    project.pro 
    logic/ 
     logic.pro 
     some logic files 
    gui/ 
     gui.pro 
     gui files 

My project.pro wygląda następująco

TEMPLATE = subdirs 
SUBDIRS = logic \ 
      gui 
SOURCES += main.cpp 

W .pro plików do podkatalogów Mam odpowiednie ŹRÓDŁA , HEADERS i ZASOBYUstawiono zmienne.

Proszę mi powiedzieć, co TARGET, WZÓR i inne niezbędne wartości należy ustawić w .pro plików.

Czy istnieje również dobry samouczek QMake, inny niż oficjalny?

Odpowiedz

80

Oprócz Troubadour's comment, chciałbym zauważyć, że docelowy SUBDIRS jest odpowiedni tylko do określania podkatalogów. Dlatego twoja dodatkowa linia

SOURCES += main.cpp 

w pliku project.pro jest nieprawidłowy, a prawdopodobnie nie budować swój plik main.cpp, co najgorsze. W najlepszym razie qmake odmówi parsowania pliku, ponieważ zawiera sprzeczne specyfikacje.

Kilka razy użyłem szablonu SUBDIRS i działa dobrze, jeśli można zbudować części w mniej lub bardziej niezależnych bibliotekach, najwyraźniej tak jak w przypadku logiki i GUI osobno. Oto jeden ze sposobów, aby to zrobić:

project_dir/ 
-project.pro 
-common.pri 
-logic/ 
----logic.pro 
----some logic files 
-gui/ 
----gui.pro 
----gui files 
-build/ 
----build.pro 
----main.cpp 

project.pro:

TEMPLATE = subdirs 
SUBDIRS = logic \ 
      gui 

# build must be last: 
CONFIG += ordered 
SUBDIRS += build 

powszechne.pri:

#Includes common configuration for all subdirectory .pro files. 
INCLUDEPATH += . .. 
WARNINGS += -Wall 

TEMPLATE = lib 

# The following keeps the generated files at least somewhat separate 
# from the source files. 
UI_DIR = uics 
MOC_DIR = mocs 
OBJECTS_DIR = objs 

logika/logic.pro:

# Check if the config file exists 
! include(../common.pri) { 
    error("Couldn't find the common.pri file!") 
} 

HEADERS += logic.h 
SOURCES += logic.cpp 

# By default, TARGET is the same as the directory, so it will make 
# liblogic.a (in linux). Uncomment to override. 
# TARGET = target 

gui/gui.pro:

! include(../common.pri) { 
    error("Couldn't find the common.pri file!") 
} 

FORMS += gui.ui 
HEADERS += gui.h 
SOURCES += gui.cpp 

# By default, TARGET is the same as the directory, so it will make 
# libgui.a (in linux). Uncomment to override. 
# TARGET = target 

build/build.pro:

TEMPLATE = app 

SOURCES += main.cpp 

LIBS += -L../logic -L../gui -llogic -lgui 

# Will build the final executable in the main project directory. 
TARGET = ../project 
+0

Dobra uwaga na temat dyrektywy SOURCES w project.pro. Tęskniłem za tym całkowicie. – Troubadour

+0

Dziękuję za tę wyczerpującą odpowiedź. To dobry punkt, aby zacząć moją naukę. – zarzych

+0

Mam wrażenie, że "uporządkowany" ma charakter globalny. Nie wydaje się, aby dwie pierwsze biblioteki jednocześnie. –

16

Używasz subdirs, jeśli logika i foldery GUI faktycznie przekazują jakiś cel, np. biblioteka, którą można zbudować niezależnie od czegokolwiek innego. W takim przypadku należy po prostu użyć

TEMPLATE = lib 
TARGET = logic 
CONFIG += dll 

w pliku logic.pro.

jeśli nie są one niezależne cele, ale są tylko foldery, które istnieją do organizowania plików źródła to można po prostu użyć .pri plik w każdy zamiast i uwzględnić je w .pro wykorzystaniem

include(logic/logic.pri) 
include(gui/gui.pri) 

Wystarczy pamiętać że ścieżki plików w plikach .pri są względne do pliku .pro i , a nie .pri. BTW, użycie pliku .pri jest opcjonalne, ponieważ nadal można wyświetlać pliki w tych folderach bezpośrednio w pliku .pro. Plik .pri sprawia, że ​​jest trochę bardziej uporządkowany i pomaga skrócić plik .pro.

+2

Z tego co ja Zauważyliśmy, że metoda pliku .pri powoduje, że Qt Creator wyświetla podfolder każdego pliku .pri i jego ents. – zarzych

+3

@zarzych: To prawda, ale denerwująco nie szanuje, gdzie plik .pri znajduje się w systemie plików i wyświetla je tylko jako listę płaską na poziomie .pro. Szczególnie denerwujące, jeśli masz kilka o tej samej nazwie. – Troubadour

Powiązane problemy