暫定主題:qmake之命令列引數及qmake啟動時載入了什麼東西,或許可以藉此學習一下qmake是處理命令列引數的方法
執行 qmake -h 可以得到qmake大部分命令列引數及其說明。本文預計涉及到的引數如下:
-project
工作於何種模式,project用來生成pro檔案。預設是makefile模式
-makefile
-spec spec
-platform spec
使用何種spec? 本文重點
-norecursive
-nr是否遞迴處理.pro檔案,
對於subdirs的層層巢狀的qt工程來說
很常用-recursive
-r-t templ
-tp prefix
-set
-unset
-query
-cache file
控制cache檔案的使用
-nocache
qmake -spec linux-g++-32 test.pro
按理說:要生成makefile
那麼,-spec linux-g++-32 究竟有什麼用呢?實際上,是通知qmake去載入乙個檔案:
$qtdir/mkspecs/linux-g++-32/qmake.conf
不妨看一眼其內容(從這兒你可以看出,config中預設啟用qt,以及qt預設有core和gui兩個模組):
## qmake configuration for linux-g++
#makefile_generator = unix
target_platform = unix
config += qt warn_on release incremental link_prl gdb_dwarf_index
qt += core gui
qmake_incremental_style = sublib
qmake_cflags = -m32
qmake_lflags = -m32
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
load(qt_config)
可是,事實上,執行qmake時,我們很多時候,只需要
qmake
原因何在?
一旦命令列引數中沒有指定 .pro檔案,那麼qmake採取的策略還是很簡單的:
原始碼:
static qstring detectprojectfile(const qstring &path)else
return ret;
}
qmake 如何確定 mkspec 呢?
囉嗦一點,下面的內容或許可作為以後討論其他內容的基礎。
可以設定環境變數 qmakeflags ,該變數的值將直接作為qmake的引數使用
如果qmake的引數與qmakeflags指定的衝突,qmake的命令列引數起作用。
如果 qmakeflags 和命令列引數中都沒有指定 mkspec,那麼將嘗試查詢環境變數 qmakespec
你可能見過 .qmake.cache 這種檔案...
如果 qmakespec 也是空的,那麼將判斷cache中是否設定了 mkspec。
這個過程相當複雜,即使我們確定了mkspec,還有很多任務作要做。
假定我們已經知道了使用了mkspec是 linux-g++-32
qmake 何處去查詢相應的mkspec檔案(比如我們一開始列出的qmake.conf)??
qstringlist qmake_mkspec_paths()ret << qlibraryinfo::location(qlibraryinfo::datapath) + concat;
return ret;
}
環境變數qmakepath以及配置引數qlibraryinfo::datapath指定目錄下的「mkspecs」子目錄!
如果我們此時沒有設定尚未設定 mkspec,它會去查詢前面這些目錄中有沒有default的子目錄,有則作為mkspec檔案的目錄!比如,在我的系統的qtdir/mkspecs目錄下,有乙個default的鏈結
...drwxr-xr-x 2 debao debao 4096 2011-06-22 23:41 cygwin-g++
drwxr-xr-x 2 debao debao 4096 2011-06-22 23:41 darwin-g++
lrwxrwxrwx 1 debao debao 9 2011-08-27 17:07 default -> linux-g++
drwxr-xr-x 6 debao debao 4096 2011-08-27 15:29 features
...
cache 檔案的定位:
看個目錄結構(shadow build的經典結構):
|----test\| `---- test.pro
||----test-build\
|`--- .qmake.cache
兩個檔案的內容如下:
message($$config)
config += dbzhang800
執行qmake ../test/test.pro,結果大致如下:
project message: lex yacc warn_on debug uic resources qt warn_on release incremental link_prl gdb_dwarf_index def_files_disabled exceptions no_mocdepend debug stl qt_no_framework dbzhang800 release
可以看出,cache檔案在起作用。
注意:如果 當前目錄中沒有 .qmake.cache,則會往上級目錄查詢,直到根目錄!!例如(查詢順序):
/home/debao/qmake-test/test-build/.qmake.cache/home/debao/qmake-test/.qmake.cache
/home/debao/.qmake.cache
/home/.qmake.cache
/.qmake.cache
qmake執行時還要載入大量的 .prf 檔案。
feature檔案目錄的確定(來自原始碼中的注釋)
1) environment variable qmakefeatures (as separated by colons)2) property variable qmakefeatures (as separated by colons)
3) (where .qmake.cache lives) + features_dir
4) environment variable qmakepath (as separated by colons) + /mkspecs/features_dir
5) your qmakespec/features dir
6) your data_install/mkspecs/features_dir
7) your qmakespec/../features_dir dir
features_dir is defined as:
1) features/(unix|win32|macx)/
2) features/
feature檔案的載入:
載入 default_post.prf 檔案
命令列引數
c 程式設計師參考 main方法可以使用引數,在這種情況下它採用下列形式之一 static int main string args static void main string args main方法的引數是表示命令行引數的string陣列。通常通過測試length屬性來檢查引數是否存在,例如 ...
命令列引數
c程式中的mian具有兩個形參。int main int argc,char argv argc 命令列引數的數目 argv 指向一組引數值的第乙個元素 每個元素都是指向乙個引數文字的指標 指標陣列 每個元素都是乙個字元指標,陣列末尾是乙個null指標,argc的值和這個null都用於確定實際傳遞了...
命令列引數
命令列引數,也是一種形式的引數。它與我們常見的函式的引數的不同點在於,他是傳遞命令列的引數。c 中可以指定任意數量的命令列引數存放在args陣列中。args陣列的第乙個元素是執行該程式的.exe檔名。向其中新增命令列引數的方法 開啟專案屬性頁面 解決方案資源管理器中,所在專案的properties選...