Domanda

Sto iniziando a imparare Qt. Mi sto spostando dal mondo di Visual Studio e sto cercando un modo per organizzare la struttura del mio progetto usando QMake. Ho trovato il modello 'subdir' ma non riesco a comprenderlo.

La struttura del mio progetto è simile al seguente:

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

Il mio project.pro assomiglia a questo

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

Nei file .pro per le sottodirectory ho impostato le variabili SOURCES , HEADERS e RESOURCES appropriate.

Per favore, dimmi quali TARGET , MODELLO e altri valori necessari che dovrei impostare nei file .pro .

Inoltre, c'è qualche buon tutorial su QMake diverso da quello ufficiale?

È stato utile?

Soluzione

Oltre a Commento di Troubadour , vorrei notare che l'obiettivo SUBDIRS è utile solo per specificare le sottodirectory. Pertanto, la tua riga extra di

SOURCES += main.cpp

nel tuo file project.pro non è corretto e probabilmente non riuscirà a creare il tuo file main.cpp, nel peggiore dei casi. Nella migliore delle ipotesi, qmake rifiuterà di analizzare il file, poiché contiene specifiche contrastanti.

Ho usato il modello SUBDIRS alcune volte, e funziona bene se puoi costruire parti in librerie più o meno indipendenti, apparentemente come hai fatto con la logica e la gui separate . Ecco un modo per farlo:

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

logica / 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

Altri suggerimenti

Usi subdir se le cartelle della logica e della gui rappresentano effettivamente una sorta di target, ad es. una biblioteca, che può essere costruita indipendentemente da qualsiasi altra cosa. In tal caso, utilizza semplicemente

TEMPLATE = lib
TARGET = logic
CONFIG += dll

in logic.pro.

Se non sono destinazioni indipendenti ma sono solo cartelle esistenti per organizzare i file di origine, è possibile utilizzare un file .pri in ciascuno di essi e includerli all'interno di .pro utilizzando

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

Ricorda solo che i percorsi dei file nei file .pri sono relativi al file .pro e non al .pri. A proposito, l'uso di un file .pri è facoltativo in quanto è ancora possibile elencare i file in quelle cartelle direttamente nel file .pro. Il file .pri lo rende un po 'più ordinato e aiuta a ridurre il file .pro.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top