相信你們不少和我同樣,用多了微軟給的便利,用人家的就十分不習慣.因而就琢磨原來用到的功能如今要整順手來,否則可以讓人怎麼活啊! 本篇主要介紹實踐使用,並不是一篇完整教程,有待讀者補充.^_^ 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的平臺有效 |
|
|
**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,若是你不用,他自動生成的就是
⑤最後這段是自動產生的,本人實在沒有仔細研究,看樣子應該是一種指定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路徑爲基礎.
③使用篩選器,僅在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 本文感謝衆多網貼,不過由於大片雷同,我也不知道原做者到底是誰. 對一搜一大片所有雷同文章的現狀很煩惱,很浪費時間.倡議你們多作總結,分享消化提煉後的有用知識!