2012-05-29 79 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