【问题标题】:How to use QMake's subdirs template?如何使用 QMake 的 subdirs 模板?
【发布时间】:2010-11-27 21:57:45
【问题描述】:

我开始学习 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教程,还有其他好的吗?

【问题讨论】:

    标签: qt qmake subdirectory


    【解决方案1】:

    除了Troubadour's comment,我会注意到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
    

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

    【讨论】:

    • 我的印象是“有序”是全球性的。它似乎没有同时创建前两个库。
    • @Walter Nissen:据我所知,你是对的。有序意味着它们都按指定的顺序连续运行。如果您愿意,您实际上可以手动指定子目录目标之间的依赖关系,这可能允许并发构建,但更难正确设置。
    • 对不起,我是个白痴,请您澄清一下:“我会注意到 SUBDIRS 目标仅适用于指定子目录。”你的意思是你不能使用TEMPLATE = subdirsalso 指定TARGETSOURCES 等以便在同一个.pro 中实际构建一些东西?
    • 跟进我之前的查询:正如建议的那样,您也不能从子目录项目文件中进行app 构建,但您实际上不需要将主可执行文件的 qmake 放在子目录中- “建造/”。您可以将“build.pro”添加到 SUBDIRS 列表的末尾 - 即在顶层有两个 .pro。
    • @SamPinkus 没错。我不记得当我写这个答案时是否支持它,但在某些情况下,最终链接会更简单,创建了一个完整的子目录。
    【解决方案2】:

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

    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 文件更短。

    【讨论】:

    • 据我所知,.pri 文件方法使 Qt Creator 显示每个 .pri 文件及其内容的子文件夹。
    • @zarzych:确实如此,但它也烦人地不尊重 .pri 文件在文件系统中的位置,只是将它们显示为 .pro 级别的平面列表。如果您有多个同名,则特别烦人。
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多