Qt Pri詳解

一、Pri文件簡介

在Qt中,Pri文件是一種項目文件,用於將C++代碼、JavaScript文件、資源文件等鏈接在一起,並生成可執行文件。Pri文件中可以定義編譯規則、鏈接規則、生成規則、部署規則等等,通過使用不同的變量和函數,來實現各種複雜的構建流程和部署流程。

Pri文件是基於Makefile語法的,因此需要使用一定的Makefile知識。同時,Qt Creator集成開發環境及其命令行工具Qt Build System(qbs)可以方便地生成Pri文件並進行構建,使得在不需要編寫完整的Makefile的情況下進行快速開發和構建成為可能。

二、Pri文件編寫基礎

Pri文件的編寫離不開變量、函數和條件判斷等基礎語法。

1. 變量的定義

Pri文件中的變量可以是預定義的系統變量,如$$PWD表示Pri文件所在的目錄;也可以是用戶自定義的變量,如SRC_DIR表示源文件目錄。變量定義的語法是:

VARIABLE_NAME = variable_value

其中,VARIABLE_NAME為變量名,variable_value為變量的值。在變量的值中,可以嵌入其他變量,例如:

SRC_DIR = $$PWD/src
OBJ_DIR = $$PWD/obj
OBJECTS_DIR = $$OBJ_DIR/$$TARGET

其中,$$TARGET表示生成文件的目標類型,可以是exe、dll、plugin等。

2. 函數的使用

Pri文件中的函數可以大大簡化複雜的構建流程,例如文件搜索、文件生成、文件拷貝、庫鏈接等等。

函數的語法是:

FUNCTION_NAME(arg1, arg2, ...)

其中,FUNCTION_NAME為函數名,arg1、arg2等為函數的參數。常用的函數包括:

  • files:用於搜索指定目錄下的所有文件
  • subdirs:指定當前目錄下的子目錄
  • target.sources:為目標文件指定源文件
  • target.depends:指定目標文件所依賴的文件
  • target.commands:為目標文件指定編譯命令、鏈接命令等
  • target.path:指定目標文件生成的路徑
  • target.link:為目標文件指定需要鏈接的庫文件以及鏈接命令等

例如:

LIBS += -lfoo
target_link($$TARGET, $$LIBS)

其中,target_link是一個自定義的函數,用於將$$LIBS中指定的庫鏈接到$$TARGET中。

3. 條件判斷

在Pri文件中,可以根據具體情況對不同的操作進行條件判斷,例如:

win32:LIBS += -lwsock32
else:LIBS += -lsocket -lnsl

其中,win32表示在Windows平台下進行操作,else表示在其他平台下進行操作。

三、Pri文件高級應用

在掌握了基礎的Pri文件語法之後,Pri文件可以進行更多複雜的編譯任務。

1. 如何指定編譯器

在Pri文件中,可以通過設置QMAKE_CXX和QMAKE_CC變量來指定編譯器:

QMAKE_CXX = g++
QMAKE_CC = gcc

2. 如何生成動態庫和靜態庫

在Pri文件中,可以通過target.commands指定動態庫和靜態庫的生成規則:

lib.path = /usr/lib
lib.name = foo
lib.files = source1.cpp source2.cpp
lib.commands = $$QMAKE_CXX -shared -o $$lib.target $$OBJECTS

其中,lib.path指定庫文件生成的路徑,lib.name指定庫文件的名稱,lib.files指定庫文件的源文件,lib.commands指定庫文件的生成命令。

3. 如何生成可執行文件和文件拷貝

可執行文件和文件拷貝的生成規則如下:

executable.output = foo
executable.files = source1.cpp source2.cpp
executable.commands = $$QMAKE_CXX -o $$executable.target $$OBJECTS
INSTALLS += exe
exe.target = /usr/bin
exe.files = $$executable.target
exe.commands = $$QMAKE_COPY $$executable.target $$exe.target

其中,executable.output指定可執行文件的名稱,executable.files指定可執行文件的源文件,executable.commands指定可執行文件的生成命令。INSTALLS指定生成文件的部署規則,exe.target指定部署目標目錄,exe.files指定需要部署的文件,exe.commands指定文件拷貝的命令。

四、Pri文件的使用案例

以下是一個簡單的Pri文件的示例:

SRC_DIR = $$PWD/src
OBJ_DIR = $$PWD/obj
TARGET_DIR = $$PWD/bin

INCLUDEPATH += $$PWD/include
LIBS += -ldl

target.path = $$TARGET_DIR
target.name = myapp

message(Building ... $$TARGET)
message(Source files: $$SOURCES)

contains(CONFIG, debug) {
    message(Building in debug mode...)

    TARGET = myappd

    COMMON_FLAGS = -g -O0
}

contains(CONFIG, release) {
    message(Building in release mode...)

    TARGET = myapp

    COMMON_FLAGS = -O2
}

sources = $$files($$SRC_DIR/*.cpp)

target.sources = $$sources

OBJECTS_DIR = $$OBJ_DIR/$$TARGET

mocable_headers = $$_PRO_FILE_PWD_/input.h
mocables = $$mocable_headers
mocables.headers = $$mocable_headers
mocables.commands = $$QTDIR/bin/moc $$mocables.headers -o $$mocables.target

QMAKE_EXTRA_TARGETS += mocables

unix {
    target.commands = $$QMAKE_CXX -o $$TARGET $$OBJECTS $$LIBS
    mocables.target = $${OBJECTS_DIR}/input.moc
    mkdir($${OBJECTS_DIR})
} else {
    target.commands = link -out:$$TARGET.exe $$OBJECTS $$LIBS
    mocables.target = $${OBJECTS_DIR}/input.moc.obj
    mkdir($$system_path($${OBJECTS_DIR}))
}

target.dependency_type = TYPE_C

target.CONFIG += dll
target.LIBS += -lfoo

DISTFILES += $$PWD/post_install_script

mocables.CONFIG += no_link_target

INSTALLS += target mocables
target.files = $$TARGET
mocables.files = $${mocable_headers}

其中,該Pri文件實現了基本的編譯和部署任務,具體實現方式如下:

  • 定義了SRC_DIR、OBJ_DIR、TARGET_DIR三個變量,用於指定源文件目錄、目標文件目錄和可執行文件目錄。
  • 指定了頭文件搜索路徑和庫文件搜索路徑。
  • 定義了BUILD_MODE變量,用於指定構建模式,debug或release。
  • 根據BUILD_MODE的設置,確定了可執行文件的名稱,以及編譯選項。
  • 依據源文件目錄下的所有.cpp文件,為目標文件指定源文件。
  • 指定了需要運行moc預編譯器的頭文件,用於生成mocable文件。
  • 指定了可執行文件的鏈接庫、庫文件等。
  • 配置了可執行文件的部署規則。

通過這個簡單的Pri文件,我們可以看到Qt Pri的強大和方便。在實際開發中,Pri文件可以根據需求定製,支持多庫編譯、多平台編譯、資源文件編譯等等,大大提高了開發效率。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/285242.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-22 15:43
下一篇 2024-12-22 15:43

相關推薦

  • Qt雷達探測教程

    本文主要介紹如何使用Qt開發雷達探測程序,並展示一個簡單的雷達探測示例。 一、環境準備 在開始本教程之前,需要確保你的開發環境已經安裝Qt和Qt Creator。如果沒有安裝,可以…

    編程 2025-04-29
  • Qt State Machine與狀態機模式

    本文將介紹Qt State Machine和狀態機模式在Qt中的實現。Qt提供了QStateMachine和QState兩個類,可以方便地實現狀態機模式,並且能有效地處理複雜的、多…

    編程 2025-04-27
  • Python中的Qt庫

    Qt庫是一個跨平台的C++圖形用戶界面(GUI)工具包。它提供了豐富的界面控件和處理系統事件的功能,可以輕鬆創建交互界面、圖形化應用和多媒體應用。而Python中的Qt庫則是Qt的…

    編程 2025-04-27
  • xmake qt:構建Qt應用的全流程解決方案

    本文將會詳細闡述xmake qt的使用方法以及其能夠解決的問題。針對Qt應用開發中的各種困境,xmake提供了一整套的解決方案,包括自動構建、依賴管理、部署打包等,極大地提高了開發…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁盤中。在執行sync之前,所有的文件系統更新將不會立即寫入磁盤,而是先緩存在內存…

    編程 2025-04-25
  • 神經網絡代碼詳解

    神經網絡作為一種人工智能技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網絡的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網絡模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • Linux修改文件名命令詳解

    在Linux系統中,修改文件名是一個很常見的操作。Linux提供了多種方式來修改文件名,這篇文章將介紹Linux修改文件名的詳細操作。 一、mv命令 mv命令是Linux下的常用命…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分佈式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web服務器。nginx是一個高性能的反向代理web服務器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25

發表回復

登錄後才能評論