qt - Qt 项目中的子目录

标签 qt qt-creator qmake subdirectory

我正在寻找一种使用 QMake 来组织我的项目结构的方法。我找到了 subdirs模板,但我很难理解它。我试图做这样的事情。谁能告诉我我是否正确。

编辑:我已阅读以下线程 How to use QMake's subdirs template?但我仍然卡住

我的项目结构如下:

MultiFuncTester.pro

 - DMM
 (DMM.cpp, DMM.h and Multifunctester.pri)

 -Safety
 (Safety.cpp, Safety.h and Multifunctester.pri)

 -Solar

 (Solar.cpp, Solar.h and Multifunctester.pri)

Main

(Main.pro, Main.cpp and Multifunctester.pri)

这里 Multifunctester.pri 文件包含所有子目录的通用内容。
我正在粘贴 MultiFuncTester.pro 和 .pri 文件以及 main.pro 文件

我已将项目的 pro 文件制作为 MultiFuncTester.pro :
# build all components recursive

TEMPLATE = subdirs

######## normal build process ########
#
# Make sure your Main.pro is in the last line to ensure correct linking!
#
 SUBDIRS  = ../../MultiFuncTester/Components/Solar/Build/Solar.pro \
       ../../MultiFuncTester/Components/DMM/Build/DMM.pro \
        ../../MultiFuncTester/Components/Safety/Build/Safety.pro \
           ../../MultiFuncTester/Components/Setup/Build/Setup.pro \
           ../../MultiFuncTester/Components/Start/Build/Start.pro \
          ../../MultiFuncTester/Components/Main/Build/Main.pro \

 CONFIG += ordered

MultiFunctester.pri 文件:
######################
# common stuff for all components
######################

TEMPLATE = lib

CONFIG += static \
      warn_on \
      qt \
      thread \
      rtti

   QT += core \
   gui

   INCLUDEPATH +=/..\
          ../../MultiFuncTester/Components \

   DEPENDPATH +=/..\
         ../../MultiFuncTester/Components \

   CONFIG += debug_and_release
   CONFIG += build_all

   QMAKE_CXXFLAGS += -Wall

   CONFIG(debug, debug|release) {
   CONFIG_SUFFIX = dbg
  } else {
  CONFIG_SUFFIX = rel
  DEFINES += QT_NO_DEBUG \
           QT_NO_DEBUG_OUTPUT \
                       DBT_TRACE_DISCARD \
           NDEBUG
 CONFIG(gcov) {
    QMAKE_CXXFLAGS_RELEASE += -fprofile-arcs -ftest-coverage
    QMAKE_LFLAGS_RELEASE += -fprofile-arcs
    QMAKE_CXXFLAGS_RELEASE -= -O2
    QMAKE_CXXFLAGS_RELEASE += -O0
}
}

CONFIG(crosstgt) {
 ### To be able to build Target run qmake as follows:
#qmake CONFIG+=crosstgt
CONFIG_SUFFIX = $${CONFIG_SUFFIX}_tgt
DEFINES += TARGET_BUILD
}

OBJECTS_DIR = obj_$${CONFIG_SUFFIX}
MOC_DIR = moc_$${CONFIG_SUFFIX}
DESTDIR = lib_$${CONFIG_SUFFIX}

Main.pro 文件:
################# include pri file #################
!include("Main.pri") {
error("Main.pri not found")
}
 ####################################################

 ################# override some pri settings #################
TEMPLATE = app
TARGET = MultiFuncTester
CONFIG -= static
QT += core \
  gui
##############################################################


################# list used MultiFuncTester libraries #################
MultiFuncTester_COMPONENTS_DIR =../../MultiFuncTester/Components

################################################################


################# list MultiFunTester libraries #################
MultiFunTester_COMPONENTS_DIR =../../MultiFuncTester/Components
MultiFunTester_COMPONENTS = DMM \
                    SOLAR\
                    Safety\
                    Setup

   ################# own sources #################
   INCLUDEPATH += ../../MultiFuncTester/Components \

   SOURCES +=../Source/Main.cpp

   ################# set destination path
   DESTDIR = bin_$$CONFIG_SUFFIX

   ################# edit include path
    INCLUDEPATH += $$MultiFunctester_COMPONENTS_DIR \

   ################# start group
  LIBS += -Wl,--start-group \

   ################# include MultiFunctester libraries and set dependencies
    for(TheComponent, MultiFunctester_COMPONENTS) {
    THELIBPATH      = $$MultiFunctester_DIR/$${TheComponent}/Build/lib_$$CONFIG_SUFFIX
    PRE_TARGETDEPS  += $$THELIBPATH/lib$${TheComponent}.a
    LIBS            += $$THELIBPATH/lib$${TheComponent}.a
    }


   ################# end group
    LIBS += -Wl,--end-group

每个子目录都有一个 .pro 文件,其中定义了头文件和源文件,还有通用的 multifunctester.pri 文件

请让我知道放置一个通用静态库(MultiFunctester.pri 文件)是一种正确的方法,它应该在代码中做什么......如果不是,请帮助我纠正我的错误。

谢谢

最佳答案

有一些错误:

  • TEMPLATE = libMultiFunctester.pri . .pri 文件就像头文件,这将被添加到每个包含它的 pro 文件中。这可能会造成混淆,因此请避免在 .pri 中使用 TEMPLATE 变量。
  • 如果我理解你的第一点,你有 Multifunctester.pri 的副本在每个目录中。这也很令人困惑,您应该只有一个(或不同的 pri 文件)。
  • 覆盖以前的设置并不是一个好主意。当您必须调试以查看每个 pro 中使用的配置时文件你会感到痛苦。而是在一个地方声明所有常用设置,而对于变量设置,当它们声明它们时
    申请。
  • 我没看到 Multifunctester.pri包括在任何地方...

  • 您使用 subdirs当您希望单独构建每个子目录时使用模板(它们可以相互依赖)。例如,当您有一个包含许多可执行文件的框架时,它很有用。看qwt source directory

    在这种情况下,您使用
    TEMPLATE = subdirs
    CONFIG  += ordered
    
    ### They MUST be subdirectories, no ../, and no .pro
    SUBDIRS +=  dir1\
                dir2\
                ...
                dirn
    

    除了最后一个级别(您有 TEMPLATE = lib or app )之外的每个级别。

    现在,如果你有目录结构,但你想一起构建,你可以创建一个pri包含源文件的每个子目录的文件。例如 :

    在主要src.pro你有的文件
     include(MultiFunctester.pri) ## for the configurations
     include($PATHTOSOLAR/Solar.pri)
     include($PATHTODMM/dmm.pri)
     include($PATHTOSAFETY/safety.pri)
     include($PATHTOSETUP/setup.pri)
     include($PATHTOSTART/start.pri)
     include($PATHTOMAIN/main.pri)
    

    在哪里 $PATHTO...src.pro 的相对路径目录。

    现在在每个子目录中都包含源文件。

    onesubdir.pri :
     headers += /PATHTOTHISSUBDIR/file1.h ## again same relative path as above
           ....
     source +=....
    

    关于qt - Qt 项目中的子目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10795890/

    相关文章:

    qt - Qt Creator 中的 "Undefined reference"错误

    QT QML资源文件修改后不重新编译

    c++ - 将 Jenkins CI 用于 Qt 项目

    c++ - 如何获取QXlsx中一行中已使用的列数

    c++ - Qt如何捕获指示所有gui元素准备就绪的事件

    python - 如何阻止图像被推离屏幕?

    c++ - 将多个文件添加到输出以用于额外的编译器 Qt

    android - 如果我在 Qt 中为 Android 和 iOS 构建游戏,我可以像游戏中心一样在其中包含 Objective-C 工具包吗?

    Qt:QTimer 什么时候开始的?

    c++ - 如何将 GUID 值分配给变量?