67

我开始学习Qt。我正在离开 Visual Studio 世界,我正在寻找一种使用 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文件中,我设置了适当的SOURCESHEADERSRESOURCES变量。

请告诉我应该在.pro文件中设置哪些TARGETTEMPLATE和其他必要的值。

另外,除了官方的之外,还有其他好的 QMake 教程吗?

4

2 回答 2

87

除了Troubadour 的评论之外,我还要注意该SUBDIRS目标仅适用于指定子目录。因此,您的额外行

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

项目.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.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

构建/构建.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
于 2009-09-13T14:21:10.527 回答
18

如果subdirslogic 和 gui 文件夹实际上代表某种目标,则使用,例如。一个库,可以独立于其他任何东西构建。如果是这种情况,那么只需使用

TEMPLATE = lib
TARGET = logic
CONFIG += dll

在 logic.pro 中。

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

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

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

于 2009-09-13T13:53:51.937 回答