QT工程pro設置實踐(with QtCreator)----非弄的像VS同樣才順手?

    相信你們不少和我同樣,用多了微軟給的便利,用人家的就十分不習慣.因而就琢磨原來用到的功能如今要整順手來,否則可以讓人怎麼活啊! 本篇主要介紹實踐使用,並不是一篇完整教程,有待讀者補充.^_^ windows

    咱們本來在VS上有一個大工程sln,裏面有lib,有dll有exe,甚至還混搭了C#.用起來一點不以爲水土不服.如今要用QT重整,而且須要到處考慮換個平臺不要讓我改東西.做爲探路先鋒,先挑了幾個基礎工程出來作實驗: app

    ↑固然,圖中是已經成事以後了.想在qtcreator中弄一個工程集還真不是那麼方便,我處處找過了,壓根沒有建立工程集的辦法.縱使你能夠一個pro一個pro的拖進去,最後也無法保存,下次打開還得從新一個一個pro的拖,沒哪一個傻蛋總這麼幹吧..因此首先就是要手動建立一個subdirs型的pro作爲工程集,也就是上面看到的
**CloudBoard_win32.pro**(subdirs舉例)
工具

TEMPLATE = subdirs

SUBDIRS =\
        raknet\
    onetengine \
    omisc \
    testDebugShow

onetengine.depends = raknet omisc
testDebugShow.depends = omisc
#CONFIG += ordered

    關於這個pro的詳細寫法,感受qt文檔寫的很細碎,反正我是沒看明白.就着廣大網友的例子纔有了上面一段.TEMPLATE=subdirs這是固定寫法,聲明是作工程集目錄的.SUBDIRS是指明目錄中有哪些項,能夠嵌套另外一個subdirs型的pro. 接下來能夠詳細定義其中的項目.如.depends表示左邊的依賴=後面的項目. 測試

.subdir
指定子項的目錄,不使用子項自己的名字.
.file
明確指定該子項使用的pro文件,默認是根據名字自動找的,該項不和.subdir同時使用
.condition
Specifies a bld.inf define that must be true for subproject to be built. Available only on Symbian platform.
.depends
該子項依賴指定的子項,只在使用makefiles的平臺有效
.makefile
該子項的makefile,只在使用makefiles的平臺有效
.target
該子項的TARGET,只在使用makefiles的平臺有效


    以上翻譯可能有問題.從新總結一下.使用subdirs =a b c d聲明的實際上是4個子項的名字.默認你很少作說明的話,qmake根據名字自動去找子目錄,啓用子目錄中的pro文件(名字優先匹配).若是你特別說明a.subdir=./z或者a.file=./z/z.pro就能夠不受名字限制. 至於.makefile,應該是你混用第三方庫的時候纔有必要手動指定使用的makefile. target能夠在子pro中指定,除非你以爲這裏比較統一方便修改.其他的未實踐很少說.

**omisc.pro**(staticlib舉例) ui

QT       -= gui   ①

TARGET = misc   ②
TEMPLATE = lib  #固定寫法
CONFIG += staticlib   #靜態庫固定寫法
#DEFINES +=   ③
DESTDIR = $$_PRO_FILE_PWD_/../lib  ④
SOURCES += \
    ostatic.cpp \
    odebugoutput.cpp

HEADERS += omisc.h \
    ostatic.h \
    ostringmap.hpp \
    odebugoutput.h
unix:!symbian {  ⑤
    maemo5 {
        target.path = /opt/usr/lib
    } else {
        target.path = /usr/lib
    }
    INSTALLS += target
}
①"QT"是使用的QT庫,從平時嚮導建立工程能夠看出,QT默認是包含gui和core,若是你不用,他自動生成的就是
QT-=core gui.此處QT-=gui表示咱們還用了core
②TARGET是生成目標,名字不作修飾(不加.a/.lib/.dll)的好處是讓qt幫咱們加,在不一樣平臺不用咱們考慮差異.
同時這裏的名字是能夠前置路徑的,如../lib/misc.它會生成在相對生成目錄上一級的lib下.不過我勸你仍是不要寫相對路徑了,由於在windows下會多出debug/release目錄,目錄深度不一樣,你換一個平臺得重寫.這還有更好的辦法,後面繼續.
③DEFINES是VS裏面的預約義頭,就是定義宏,哎喲總算見着熟人了~
④DESTDIR就是剛纔②說的好辦法.它控制最終的輸出,至關於VS的OurDir.此處咱們控制它輸出到$$_PRO_FILE_PWD_/../lib.前面$$開頭的是一個pro變量 ,存放的是工程路徑,就是CloudBoard_win32.pro的路徑,還有更多的定義參考Qt助手. 你能夠用相似message($$_PRO_FILE_)的語句測試變量究竟是什麼值.具體使用是:寫在pro中,右鍵pro的工程執行qmake.從編譯輸出中能夠看到.

⑤最後這段是自動產生的,本人實在沒有仔細研究,看樣子應該是一種指定target目錄的辦法.而unix:!symbian讓人不難想到,這是在篩選特定平臺.具體的歡迎您測試後補充^_^ lua

    raknet相信不少童鞋瞭解,本案簡單將其代碼編譯成staticlib,DESTDIR=$$_PRO_FILE_PWD_/../lib完工 spa

**onetengine.pro**(動態庫舉例) 翻譯

!include( ../common.pri ) {  ①
    error(" Couldn't find the common.pri file! ")
}

QT       -= gui
QT       += network xml

TARGET = netengine
TEMPLATE = lib
DESTDIR = ../bin  #基於生成目錄

INCLUDEPATH +=  ../omisc ../raknet/source  ②
DEPENDPATH += ../omisc ../raknet/source #基於工程目錄
win32:LIBS += -lWs2_32  ③
LIBS += -lmisc -lraknet

DEFINES += ONETENGINE_LIBRARY  ④

SOURCES += onetengine.cpp \
    netengine_export.cpp

HEADERS += onetengine.h\
        onetengine_global.h \
    ../include/macrodefine.h \
    ../interface/isinkfornetengine.h \
    ../interface/inetengine.h

**common.pri**(pro包含舉例) debug

INCLUDEPATH += ../interface ../include  ⑤
#LIBS += -L$$QTDIR/lib
LIBS += -L../../src/lib
LIBS += -L../lib
①沒錯,pro中也是能夠include的,以當前文件爲起點將上一層的common.pri包含進來.common.pri中的相對路徑依然以當前pro路徑爲基礎.
②INCLUDEPATH是包含目錄,相似於VS中的附加包含目錄.至於 DEPENDPATH本人實事求是沒有研究不明白有什麼用.歡迎補充^_^

③使用篩選器,僅在win32下增長Ws2_32.lib的導入. LIBS至關於VS中的附加依賴庫,不一樣的是能夠經過-L指定庫目錄,-l指定庫名.其間沒有空格的哦.例如上面的LIBS+=-L../lib -lmisc就是能夠到../lib中找misc庫.misc沒有說明.a仍是.lib是讓qt幫咱們作.你也能夠指定.lib,而後經過篩選器把其餘平臺的也寫一下.
④提供宏定義ONETENGINE_LIBRARY是由於在嚮導建立動態庫的時候qtcreator幫咱們定義了這樣的 unix

#ifndef ONETENGINE_GLOBAL_H
#define ONETENGINE_GLOBAL_H

#include <QtCore/qglobal.h>

#if defined(ONETENGINE_LIBRARY)
#  define ONETENGINESHARED_EXPORT Q_DECL_EXPORT
#else
#  define ONETENGINESHARED_EXPORT Q_DECL_IMPORT
#endif

#endif // ONETENGINE_GLOBAL_H


提供宏定義ONETENGINE_LIBRARY決定了該工程的做用是導出動態庫的.
⑤最後common.pri只是定義了幾項公共的沒有平臺差別的信息

    好了,testDebugShow的工程pro就很少說了,它和動態庫的很類似,只有TEMPLATE=app沒有XXXX_LIBRARY的宏定義而已.

    最後補充一點,爲何總的工程名要叫CloudBoard_win32呢,明眼人一看就知道這是要分平臺了呢.沒錯,一開始我也以爲一個pro就搞定了,裏面能夠有篩選器,一份pro足以應付.可是實際是qtcreator會爲pro產生同名的.user文件,qtcreator的一些配置會寫在.user裏面,例如最關鍵的qtSDK位置,編譯工具,構建/生成設置等.這些必須根據生成所處的環境區別設置. 因此當你原樣跑到Linux下,啓動pro就會告訴你配置是別處讀來的,是否使用?是:配置必定是錯的,否:配置被清洗.這都不是咱們但願的.因此惟有分平臺建總pro了.

秉承開源精神,以上內容歡迎糾正,補充!

尊重原創,尊重知識產權,從我作起.@2013/01/09 本文感謝衆多網貼,不過由於大片雷同,我也不知道原做者到底是誰. 對一搜一大片所有雷同文章的現狀很煩惱,很浪費時間.倡議你們多作總結,分享消化提煉後的有用知識!

相關文章
相關標籤/搜索