2009-09-13 11 views
59

Estoy empezando a aprender Qt. Me estoy moviendo del mundo de Visual Studio y estoy buscando una forma de organizar la estructura de mi proyecto usando QMake. Encontré la plantilla 'subdirectorios', pero me cuesta bastante entenderla.¿Cómo usar la plantilla de subdirectorios de QMake?

Mi estructura del proyecto se parece a esto:

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

Mi project.pro se parece a esto

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

En los .pro archivos de los subdirectorios que tienen apropiadas FUENTES , ENCABEZADOS y RECURSOS variables establecidas.

Por favor, dime lo que OBJETIVO, PLANTILLA y otros valores necesarios que debería establecer en los .pro archivos.

Además, ¿hay algún buen tutorial de QMake que no sea el oficial?

Respuesta

80

Además de Troubadour's comment, me gustaría señalar que el objetivo SUBDIRS solo sirve para especificar subdirectorios. Por lo tanto, su línea adicional de

SOURCES += main.cpp 

en su archivo project.pro es incorrecta, y es probable que no se aprovecha su archivo main.cpp, en el peor. En el mejor de los casos, qmake se negará a analizar el archivo, ya que contiene especificaciones contradictorias.

He usado la plantilla SUBDIRS varias veces, y funciona bien si puede compilar partes en bibliotecas más o menos independientes, aparentemente como si tuviera la lógica y la interfaz gráfica de usuario separadas. Esta es una manera de hacer esto:

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 

común.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 

lógica/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 

acumulación/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

Buen punto sobre la directiva SOURCES en project.pro. Lo extrañé por completo. – Troubadour

+0

Gracias por esta respuesta integral. Es un buen punto para comenzar mi aprendizaje. – zarzych

+0

Tengo la impresión de que "ordenado" es global. No parece hacer las dos primeras bibliotecas al mismo tiempo. –

16

Utiliza subdirs si las carpetas de lógica y gui realmente representan algún tipo de objetivo, ej. una biblioteca, que se puede construir independientemente de cualquier otra cosa. Si ese es el caso, solo use

TEMPLATE = lib 
TARGET = logic 
CONFIG += dll 

en logic.pro.

si no son objetivos independientes, pero son sólo las carpetas que existen para organizar los archivos de fuentes a continuación, puedes utilizar un archivo .pri en cada lugar y los incluyen dentro del .pro usando

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

Sólo recuerde que las rutas de archivos en los archivos .pri son relativas al archivo .pro y no a .pri. Por cierto, el uso de un archivo .pri es opcional, ya que puede seguir enumerando los archivos en esas carpetas directamente en el archivo .pro. El archivo .pri lo hace un poco más ordenado y ayuda a mantener el archivo .pro más corto.

+2

Por lo que He aprendido, el método de archivo .pri hace que Qt Creator muestre la subcarpeta para cada archivo .pri y su continuación. ents. – zarzych

+3

@zarzych: Eso es cierto, pero también molestamente no respeta dónde está el archivo .pri en el sistema de archivos y simplemente los muestra como una lista plana en el nivel .pro. Particularmente molesto si tienes varios con el mismo nombre. – Troubadour

Cuestiones relacionadas