qmake 亂亂亂談 二

2021-08-26 04:34:13 字數 4067 閱讀 6715

接前面qmake 亂亂亂談(一),繼續看看qmake。

暫定主題: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

那麼,-speclinux-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 檔案

qmake 亂亂亂談 四

繼續qmake,本文主題 低調的 template subdirs 非常非常常用的乙個東西,可是manual中卻介紹的很少,太低調了。在編寫包含多可執行檔案 庫 外掛程式 的程式時,一直不敢相信subdirs的能力,以至於曾一度想轉到cmake之下。manual 中對 template subdir...

qmake 亂亂亂談 三

接前面的qmake 亂亂亂談 一 以及qmake 亂亂亂談 二 本文看看qmake中的函式 manual中有的就不重複了 函式分兩種 函式還可以分兩種 真不知道怎麼敘述 以進行資料處理為目的的函式?返回值是處理結果。前面提到,兩類函式中,exists qtdir lib libqt mt file ...

亂談 2 不再亂談

累了,不想再寫下去了.有些東西感覺寫的過頭,寫完又刪除了,過猶不及,點到即止,過頭了的東西放網上,誰知道會搞出什麼問題,下一步集中精力做我的下十年去了.幾篇暢想和亂彈,已經打好了最後終結所需的東西,最後完全算是有個交待,給萬一以後有人進來看到,不能浪費了人家的時間和熱情.對於函式式程式設計,感覺自已...