2012-05-29 78 views
4

我正在寻找一种方式使用QMAKE组织我的项目结构。我找到了subdirs模板,但我很难理解它。我试图做这样的事情。任何人都可以请告诉我,我是否正确。子目录在一个Qt项目

编辑:我已阅读以下螺纹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文件

我做了项目的亲文件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文件)是一种正确的方法,它将在代码中执行什么操作。 ....如果不是,请帮我纠正我在哪里我错了。

感谢

+0

您使用QT-创造者? – UmNyobe

+1

是的,我正在使用Qt的创造者... – pragati

+1

你有每个子目录中的pro文件吗?如果是这样的话? – UmNyobe

回答

0

有一些错误:

  • MultiFunctester.priTEMPLATE = lib。 .pri文件就像头文件一样,它将被添加到包含它的每个专业文件中。这可能会造成混淆,因此要避免使用模板变量.pri
  • 如果我没有理解好你的第一点,你必须在每个目录的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 +=.... 
+0

你有没有经过这个问题链接的帖子? – pragati

+0

如果有不明确的地方请指定 – UmNyobe

+0

其实我发布的这段代码运行良好。一个简单的问候世界很容易显示。但是,当我尝试从目录中的任何一个函数使用说,开始...我得到错误,未定义的引用开始....我main.o和start.o没有得到正确链接...我不知道为什么? – pragati