wake-up-neo.com

Wie verwende ich die Subdir-Vorlage von QMake?

Ich fange an, Qt zu lernen. Ich verlasse die Visual Studio-Welt und suche nach einer Möglichkeit, die Struktur meines Projekts mithilfe von QMake zu organisieren. Ich habe die Vorlage "subdirs" gefunden, kann sie aber nur schwer verstehen.

Meine Projektstruktur sieht so aus:

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

Mein project.pro sieht so aus

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

In den . Pro Dateien für die Unterverzeichnisse habe ich entsprechende QUELLEN , HEADER und RESSOURCEN Variablen gesetzt.

Bitte sagen Sie mir, was TARGET , TEMPLATE und andere notwendige Werte, die ich in der einstellen sollte . pro Dateien.

Gibt es auch ein anderes gutes QMake-Tutorial als das offizielle?

64
zarzych

Zusätzlich zu Troubadours Kommentar würde ich bemerken, dass das SUBDIRS -Ziel nur zum Angeben von Unterverzeichnissen geeignet ist. Daher ist Ihre zusätzliche Linie von

SOURCES += main.cpp

in Ihrer project.pro-Datei ist falsch und kann Ihre main.cpp-Datei wahrscheinlich im schlimmsten Fall nicht erstellen. Qmake lehnt es bestenfalls ab, die Datei zu analysieren, da sie widersprüchliche Angaben enthält.

Ich habe die SUBDIRS -Vorlage einige Male verwendet, und es ist gut, wenn Sie Teile in mehr oder weniger unabhängige Bibliotheken einbauen können, anscheinend so, wie Sie es mit der Trennung von Logik und GUI getan haben. Hier ist eine Möglichkeit, dies zu tun:

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

common.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

logic/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
85

Sie verwenden subdirs, wenn der Logik- und der GUI-Ordner tatsächlich eine Art Ziel darstellen, z. eine Bibliothek, die unabhängig von allem anderen aufgebaut werden kann. Wenn dies der Fall ist, verwenden Sie einfach

TEMPLATE = lib
TARGET = logic
CONFIG += dll

in logic.pro.

Wenn es sich nicht um unabhängige Ziele handelt, sondern nur um Ordner, die zum Organisieren der Quelldateien vorhanden sind, können Sie stattdessen jeweils eine PRI-Datei verwenden und diese in die PRO-Datei einschließen

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

Denken Sie daran, dass die Dateipfade in den PRI-Dateien relativ zur PRO-Datei und nicht zur PRI-Datei sind. Übrigens ist die Verwendung einer .pri-Datei optional, da Sie die Dateien in diesen Ordnern weiterhin direkt in der .pro-Datei auflisten können. Die .pri-Datei macht es nur ein bisschen ordentlicher und hilft dabei, die .pro-Datei kürzer zu halten.

17
Troubadour