Qt 如何使用QMake';s细分曲面模板?

Qt 如何使用QMake';s细分曲面模板?,qt,qmake,subdirectory,Qt,Qmake,Subdirectory,我开始学习Qt。我将离开VisualStudio世界,我正在寻找一种使用QMake组织项目结构的方法。我已经找到了“细分曲面”模板,但我很难理解它 我的项目结构如下所示: project_dir/ main.cpp project.pro logic/ logic.pro some logic files gui/ gui.pro gui files 我的project.pro看起来像这样 TEMPLATE = s

我开始学习Qt。我将离开VisualStudio世界,我正在寻找一种使用QMake组织项目结构的方法。我已经找到了“细分曲面”模板,但我很难理解它

我的项目结构如下所示:

project_dir/
    main.cpp
    project.pro
    logic/
      logic.pro
      some logic files
    gui/
      gui.pro
      gui files
我的project.pro看起来像这样

TEMPLATE = subdirs
SUBDIRS = logic \
          gui
SOURCES += main.cpp
在子目录的.pro文件中,我设置了适当的源、头和资源变量

请告诉我应该在.pro文件中设置什么目标、模板和其他必要的值


另外,除了正式的QMake教程之外,还有什么好的QMake教程吗?

如果逻辑和gui文件夹实际上是某种目标,例如可以独立于任何其他对象构建的库,那么您可以使用
subdirs
。如果是这样的话,就用

TEMPLATE = lib
TARGET = logic
CONFIG += dll
在logic.pro中

如果它们不是独立的目标,而只是用于组织源文件的文件夹,则可以在每个文件夹中使用.pri文件,并使用.pro将它们包含在.pro中

include(logic/logic.pri)
include(gui/gui.pri)
请记住,.pri文件中的文件路径是相对于.pro文件的,而不是相对于.pri文件的。顺便说一句,使用.pri文件是可选的,因为您仍然可以直接在.pro文件中列出这些文件夹中的文件。.pri文件只是使它更整洁,并有助于使.pro文件更短。

此外,我要注意的是,
子目录
目标仅适用于指定子目录。因此,您额外的

SOURCES += main.cpp
project.pro文件中的错误,最坏情况下可能无法生成main.cpp文件。qmake最多会拒绝解析该文件,因为其中的规范相互冲突

我已经使用过几次
SUBDIRS
模板,如果您可以将部分构建到或多或少独立的库中,它会做得很好,很明显,就像您将逻辑和gui分开一样。有一种方法可以做到这一点:

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

据我所知,.pri file方法使Qt Creator为每个.pri文件及其内容显示子文件夹。@zarzych:没错,但令人恼火的是,它不考虑.pri文件在文件系统中的位置,只在.pro级别将其显示为一个平面列表。如果你有几个名字相同,那就特别烦人。我的印象是“有序”是全球性的。它似乎没有使前两个库同时运行。@Walter Nissen:据我所知,你是对的。有序是指它们都以指定的顺序连续运行。如果愿意,您实际上可以手动指定子目录目标之间的依赖关系,这可能会允许并发生成,但很难正确设置。对不起,我是个白痴,请您澄清:“我要注意,子目录目标仅适用于指定子目录。”你的意思是你不能使用
TEMPLATE=subdirs
,也不能指定
TARGET
SOURCES
等来实际构建某个东西,在同一个.pro中?根据我之前的查询:正如建议的那样,你也不能从subdirs项目文件进行
app
构建,但实际上,您不需要将主可执行文件的qmake放在subdir-“build/”中。您可以将“build.pro”添加到
子目录的末尾,即在顶层有两个.pro。@SamPinkus这是正确的。我不记得在我写这个答案的时候是否支持,但是在某些情况下,对于最后的链接更简单,会创建一个完整的子目录。