Qmake高階概念

2021-07-24 20:14:45 字數 4621 閱讀 8301



迄今為止,我們見到的qmake專案檔案都非常簡單,僅僅是一些name = value和name += value的列表行。qmake提供了很多更強大的功能,比如你可以使用乙個簡單的專案檔案來為多個平台生成makefile。

到目前為止,你已經看到在專案檔案中使用的=操作符和+=操作符。這裡能夠提供更多的可供使用的操作符,但是其中的一些需要謹慎地使用,因為它們也許會比你期待的改變的更多。

「=」操作符

這個操作符簡單分配乙個值給乙個變數。使用方法如下:

「+=」操作符

這個操作符將會向乙個變數的值的列表中新增乙個值。使用方法如下:

defines += qt_dll
這將會把qt_dll新增到被放到makefile中的預處理定義的列表中。

「-=」操作符

這個操作符將會從乙個變數的值的列表中移去乙個值。使用方法如下:

defines -= qt_dll
這將會從被放到makefile中的預處理定義的列表中移去qt_dll。

「*=」操作符

這個操作符僅僅在乙個值不存在於乙個變數的值的列表中的時候,把它新增進去。使用方法如下:

defines *= qt_dll
只用在qt_dll沒有被定義在預處理定義的列表中時,它才會被新增進去。

「~=」操作符

這個操作符將會替換任何與指定的值的正規表示式匹配的任何值。使用方法如下:

defines ~= s/qt_[dt].+/qt
這將會用qt來替代任何以qt_d或qt_t開頭的變數中的qt_d或qt_t。

作用域和「if」語句很相似,如果某個條件為真,作用域中的設定就會被處理。作用域使用方法如下:

win32
上面的**的作用是,如果在windows平台上使用qmake,qt_dll定義就會被新增到makefile中。如果在windows平台以外的平台上使用qmake,這個定義就會被忽略。你也可以使用qmake執行乙個單行的條件/任務,就像這樣:

win32:defines += qt_dll
比如,假設我們想在除了windows平台意外的所有平台處理些什麼。我們想這樣使用作用域來達到這種否定效果:

!win32
config行中的任何條目也都是乙個作用域。比如,你這樣寫:

config += warn_on
你將會得到乙個稱作「warn_on」的作用域。這樣將會使在不丟失特定條件下可能所需的所有自定義設定的條件下,很容易地修改專案中的配置。因為你可能把你自己的值放到config行中,這將會為你的makefile而提供給你乙個非常強大的配置工具。比如:

config += qt warn_on debug

debug

release

當然也可以在處理一些設定之前檢查兩個事物。例如,如果你想檢查平台是否是windows並且執行緒設定是否被設定,你可以這樣寫:

win32 

}

為了避免寫出許多巢狀作用域,你可以這樣使用冒號來巢狀作用域:

win32:thread
一旦乙個測試被執行,你也許也要做else/elseif操作。這種情況下,你可以很容易地寫出複雜的測試。這需要使用特殊的「else」作用域,它可以和其它作用域進行組合(也可以向上面一樣使用冒號),比如:

win32:thread  else:debug  else
到目前為止我們遇到的變數都是系統變數,比如defines、sources和headers。你也可以為你自己建立自己的變數,這樣你就可以在作用域中使用它們了。建立自己的變數很容易,只要命名它並且分配一些東西給它。比如:

my_variable = value
現在你對你自己的變數做什麼是沒有限制的,同樣地,qmake將會忽略它們,除非需要在乙個作用域中考慮它們。

你也可以通過在其它任何乙個變數的變數名前加$$來把這個變數的值分配給當前的變數。例如:

my_defines = $$defines
現在my_defines變數包含了專案檔案在這點時defines變數的值。這也和下面的語句一樣:

my_defines = $$
第二種方法允許你把乙個變數和其它變數連線起來,而不用使用空格。qmake將允許乙個變數包含任何東西(包括$(value),可以直接在makefile中直接放置,並且允許它適當地擴張,通常是乙個環境變數)。無論如何,如果你需要立即設定乙個環境變數,然後你就可以使用$$()方法。比如:

my_defines = $$(env_defines)
join( variablename, glue, before, after )

這將會在variablename的各個值中間加入glue。如果這個變數的值為非空,那麼就會在值的前面加乙個字首before和乙個字尾after。只有variablename是必須的字段,其它預設情況下為空串。如果你需要在glue、before或者after中使用空格的話,你必須提供它們。

member( variablename, position )

這將會放置variablename的列表中的position位置的值。如果variablename不夠長,這將會返回乙個空串。variablename是唯一必須的字段,如果沒有指定位置,則預設為列表中的第乙個值。

find( variablename, substr )

這將會放置variablename中所有匹配substr的值。substr也可以是正規表示式,而因此將被匹配。

my_var = one two three four

my_var2 = $$join(my_var, " -l", -l) -lfive

my_var3 = $$member(my_var, 2) $$find(my_var, t.*)

my_var2將會包含「-lone -ltwo -lthree -lfour -lfive」,並且myvar3將會包含「three two three」。

system( program_and_args )

這將會返回程式執行在標準輸出/標準錯誤輸出的內容,並且正像平時所期待地分析它。比如你可以使用這個來詢問有關平台的資訊。

uname = $$system(uname -s)

contains( uname, [ll]inux ):message( this looks like linux ($$uname) to me )

qmake提供了可以簡單執行,但強大測試的內建函式。這些測試也可以用在作用域中(就像上面一樣),在一些情況下,忽略它的測試值,它自己使用測試函式是很有用的。

contains( variablename, value )

如果value存在於乙個被叫做variablename的變數的值的列表中,那麼這個作用域中的設定將會被處理。例如:

contains( config, thread )
如果thread存在於config變數的值的列表中時,那麼qt_thread_support將會被加入到defines變數的值的列表中。

count( variablename, number )

如果number與乙個被叫做variablename的變數的值的數量一致,那麼這個作用域中的設定將會被處理。例如:

count( defines, 5 )
error( string )

這個函式輸出所給定的字串,然後會使qmake退出。例如:

error( "an error has occured" )
文字「an error has occured」將會被顯示在控制台上並且qmake將會退出。

exists( filename )

如果指定檔案存在,那麼這個作用域中的設定將會被處理。例如:

exists( /local/qt/qmake/main.cpp )
如果/local/qt/qmake/main.cpp存在,那麼main.cpp將會被新增到原始檔列表中。

注意可以不用考慮平台使用「/」作為目錄的分隔符。

include( filename )

專案檔案在這一點時包含這個檔名的內容,所以指定檔案中的任何設定都將會被處理。例如:

isempty( variablename )

這和使用count( variablename, 0 )是一樣的。如果叫做variablename的變數沒有任何元素,那麼這個作用域中的設定將會被處理。例如:

isempty( config )
message( string )

這個函式只是簡單地在控制台上輸出訊息。

message( "this is a message" )
文字「this is a message」被輸出到控制台上並且對於專案檔案的處理將會繼續進行。

system( command )

特定指令被執行並且如果它返回乙個1的退出值,那麼這個作用域中的設定將會被處理。例如:

system( ls /bin )
所以如果命令ls /bin返回1,那麼bin/main.cpp將被新增到原始檔列表中並且bin/main.h將被新增到頭檔案列表中。

infile( filename, var, val )

如果filename檔案(當它被qmake自己解析時)包含乙個值為val的變數var,那麼這個函式將會返回成功。你也可以不傳遞第三個引數(val),這時函式將只測試檔案中是否分配有這樣乙個變數var。

Redis概念高階

redis本質上是乙個key value型別的記憶體資料庫,整個資料庫載入在記憶體中進行操作,定期通過非同步操作把資料庫資料flush到硬碟上進行儲存。因為是純記憶體操作,redis的效能非常出色,每秒可以處理超過10萬次讀寫操作,是已知效能最快的key value db。redis支援多種資料結構...

qmake設定技巧

debug下新增d作為字尾build pass config debug,debug release 設定生成的dll要複製到的路徑 設定輸出路徑等 destdir lib dlldestdir bin 多專案,設定依賴關係 template subdirs project1.file pwd pr...

PL SQL 異常高階概念

做好了準備想要接受難一點的概念,結果發現,其實這一章很水。orerror number是與特定錯誤訊息相關聯的錯誤編號,這個編號的範圍在 20999到 20000之間 避免與內建編號衝突 keep errors是boolean型別,決定是否加入錯誤棧 true 或者替換錯誤棧 false 預設是fa...