2 5 知識點 pri檔案有啥用

2022-07-08 09:21:14 字數 4450 閱讀 1157

當進行中大型qt專案研發時,在各個子專案的pro檔案中經常會出現重複配置。為了處理這個問題,qt提供了另外乙個專案配置檔案:pri檔案。在pri檔案裡,可以編寫用於各個子專案的公共變數,還可以配置各種公共的編譯選項、配置各種公共路徑。本節將以常用關鍵字(見表2-3)為線索,介紹pri檔案的各種用途。

表2-3 pro和pri檔案常用關鍵字

關鍵字(或關鍵字型別)

含義

include

在pro中引入某pri檔案

環境變數

在pri中使用環境變數

變數在pri中定義與使用變數

函式pri中提供的常用函式

unix/win32

用來定義在不同平台下構建專案時的配置項分支

defines

在pri中定義巨集

config

專案的配置引數

qmake_cxxflags

配置編譯標誌

下面分別進行介紹。

1.include

include用來在pro或pri中引入某pri檔案。

語法:include  (pri檔案全路徑名)  

比如:include  ($(traindevhome)/src/gui_base.pri)

注意:

(1)include後面有空格。用括號把pri檔名括起來。

(2)pri檔案路徑中的目錄分隔符用「/」,請不要使用「\」。

(3)pri檔案只能被另乙個pri檔案或pro檔案引用,不能在.h或.cpp檔案中用#include語句引用pri檔案。

2.環境變數

有時在構建專案時會碰到如下問題:將專案編譯為32位還是64位,編譯成debug版還是release版等。這可以通過定義環境變數來解決。那麼,在pri檔案中怎樣使用這些環境變數呢?使用環境變數的語法如下:

$$(環境變數名稱)

下面看一下對環境變數traindevhome的使用。該環境變數分別用來描述gui_base.pri的檔案路徑以及ks02_04專案的object_dir配置項的值。

**清單2-14

include ($$(traindevhome)/src/gui_base.pri)

objects_dir = $$(traindevhome)/obj/chapter02/ks02_04

3.變數與環境變數

除了環境變數之外,有時候為了方便還可以自定義一些變數。比如,qt的isempty()函式不識別環境變數,因此可以通過變數來解決這個問題(見**清單2-14)。

**清單2-1

4devhome = $$(traindevhome)

isempty(devhome)

isempty()函式不識別環境變數,但它可以識別自定義的變數,所以在**清單2-14中定義了devhome變數。這樣isempty()就可以通過devhome變數間接對traindevhome這個環境變數的取值進行判斷。如果未定義traindevhome環境變數,編譯器就會報錯。

變數的使用語法同環境變數不同,使用變數時不加括號。 變數的使用語法:$$變數名。比如:

tempdir = $$(traindevhome)/obj/chapter02/ks02_04

objects_dir = $$tempdir

對環境變數和變數的使用做一下說明:

(1)在一行語句中,所引用的變數或環境變數的總個數不能超過1個。

錯誤的寫法:

chapter = chapter02

tempdir = (t

rain

devh

ome)

/obj

/'>(traindevhome)/obj/

chapter/ks02_04

正確的寫法:

tempdir = $$(traindevhome)/obj/chapter02/ks02_04

(2)使用環境變數的語法跟使用變數的語法不同(環境變數名要用括號)。

環境變數語法: $$(環境變數名)

變數語法:     $$變數名

4.函式

在**清單2-14中,介紹了isempty()函式、error()函式,實際上qt還提供了一些其他函式。

1)isemtpy()

isemtpy()函式用來判斷乙個變數是否為空值,比如:

devhome = $$(traindevhome)

isempty(devhome)

2)equals(a, b)

equals(a, b)函式用來判斷某個變數的值是否與指定值相等。**清單2-15表示如果buildtype的值是debug則執行標號①處的**。

**清單2-15

buildtype = $$(trainbuildtype)

equals(buildtype, debug)

3)error()

error()函式用來輸出錯誤資訊,並終止當前構建過程,比如:

isempty(devhome)

4)contains(x, y)

contains(x, y)函式用來判斷乙個變數x是否包含字串y。**清單2-16表示如果train_qmakespec的值包含「hpux.」,則執行花括號中的配置。

**清單2-16

contains(train_qmakespec, hpux.* )

5)unix/win32

unix和win32用來配置不同平台下的配置項。如**清單2-17中linux、unix平台均使用unix配置項,而windows平台使用win32配置項。建議所有的

}#win32下宣告使用預編譯標頭檔案

win32

6)defines

defines用來在pro、pri檔案中定義巨集。這些巨集可以在源**中使用,比如**清單2-18中標號①處、標號②處、標號③處定義的unix、__unix、win32、train_64。

**清單2-18

#unix下編譯設定

unix

#win32下編譯設定

win32

equals(buildbit,64)

注意:標號①處、標號②處、標號③處的defines後面的*=表示累加。

**清單2-18中定義的unix、__unix、win32、train_64,可以在源**中使用。比如:

// dialog.cpp

#ifdef  __unix

...#endif

#ifdef  train_64

...#endif

7)config

config配置項在pri中與pro中用法一樣。config常用的選項有:

config += console qt debug release thread warn_on

下面分別進行介紹。

(1)console表示本專案是命令列程式,在啟動本專案的目標程式時會啟動乙個終端(命令列)。

(2)qt表示本專案要載入qt的庫,鏈結時要鏈結qt的類庫。

(3)debug和release分別表示將專案構建成debug版本還是release版本。

(4)thread表示程式是否啟用多執行緒。如果沒有thread選項,專案將無法使用多執行緒。

(5)warn_on表示是否顯示編譯警告。因為有些編譯警告還是很重要的,所以建議開啟該配置項。如果不關注或者不處理編譯警告,也有可能導致程式執行時異常。

8)qmake_cxxflags

qmake_cxxflags用來為編譯器指示一些編譯標誌,比如:

# 去掉strcpy等編譯警告

qmake_cxxflags *= -wd499

# ui 生成的檔案使用 utf-8 編碼,編譯時產生4819 警告,因此去掉

qmake_cxxflags *= -wd4819

在進行中大型專案開發時經常會用到pri檔案。如果僅僅編寫乙個獨立的exe模組,那麼pri檔案可能不會發揮太大作用,因為可以把pri中的配置項直接編寫到pro檔案中。但是建議進行軟體研發時要進行標準化操作,比如:建立一套pri檔案並在團隊的所有專案中使用,那麼在建立新專案時將會非常方便。

現在,回顧一下本節的主要內容:

(1)pri檔案路徑中的目錄分隔符要用「/」,請不要使用「\」。

(2)pri檔案只能被pro檔案或另乙個pri檔案引用。

(3)使用環境變數的語法跟使用變數的語法不同:

使用環境變數的語法:$$(環境變數名)

使用變數的語法:$$變數名

(4)在pro或pri中,qt提供了一些函式來進行判斷或者輸出資訊,比如 isempty()、error()等。

(5)在使用config的配置項進行判斷時,建議所有的{跟配置關鍵字在同一行,不要換行。

(6)在pri中定義的巨集可以在**中使用。

《qt 5/pyqt 5實戰指南》目錄

檔案系統知識點

1 堆檔案 類似資料庫的堆表,記憶體管理中的堆,記錄是無序儲存的,要訪問乙個記錄需要知道其位址 位移 mds的masterbin就是這種檔案,自己維護metadata pointer table 2雜湊檔案 記錄按照key雜湊到塊,hash key n,n是總塊數。然後存入相應塊裡,如果塊滿了,就插...

Python 檔案知識點總結

open test.txt 檔案存於執行檔案所在的目錄時 open 子目錄 test.txt 檔案存於執行檔案所在目錄的子目錄時 open e test.txt 檔案存於任何位置時 基本的開啟方式 開啟模式 執行操作 r 以唯讀方式開啟檔案 預設 w 以寫入的方式開啟檔案,會覆蓋已存在的檔案 x 以...

檔案的小知識點

import traceback import os os.path.splitext file name 0 獲取檔案的字首 os.path.splitext file name 1 獲取檔案的字尾 注意 如果檔案編碼是 utf 8 需要使用notepad 去掉檔案的bom頭 r模式 開啟檔案只用...