天天看點

Qt .pro檔案之defineReplace函數的用法,實作lib檔案名自動添加字尾“d“

本篇講解在Qt的.pro檔案使用defineReplace函數。

1、先看官網的說明文檔

https://doc.qt.io/qt-5/qmake-language.html#replace-functions

1.1 文法

使用defineReplace函數定義func函數

defineReplace(func)

{

}

1.2 func傳參

$$func(11, 22, 33)

1.3 函數傳回值

無論是傳回什麼值都需要括号。可以忽略不寫。

return (Hello world!)

1.4 func捕獲參數(1到N)

ARG1 = $$1

ARG2 = $$2

ARG3 = $$3

2、舉例說明

2.1 建立一個公共的pri檔案,想讓debug生成的庫檔案名字尾+d,可以通過defineReplace函數來實作:

common.pri
defineReplace(qtLibraryName) {
   unset(LIBRARY_NAME)
   LIBRARY_NAME = $$1
   CONFIG(debug, debug|release) {
      !debug_and_release|build_pass {
          mac:RET = $$member(LIBRARY_NAME, 0)_debug
              else:win32:RET = $$member(LIBRARY_NAME, 0)d
      }
   }
   isEmpty(RET):RET = $$LIBRARY_NAME
   return($$RET)
}
#指定生成的臨時檔案放置的目錄
MOC_DIR = temp/moc
RCC_DIR = temp/rcc
UI_DIR = temp/ui
OBJECTS_DIR = temp/obj
#指定生成的應用程式放置的目錄
IDE_SOURCE_TREE = $$PWD #.pro或.pri檔案所在的位置
IDE_BUILD_TREE  = $$IDE_SOURCE_TREE/../
win32:CONFIG(debug, debug|release){
    contains(DEFINES, WIN64) {
    DESTDIR = $$IDE_BUILD_TREE/_debug64
    } else {
    DESTDIR = $$IDE_BUILD_TREE/_debug86
    }
} else:win32:CONFIG(release, debug|release){
    contains(DEFINES, WIN64) {
    DESTDIR = $$IDE_BUILD_TREE/_release64
    } else {
    DESTDIR = $$IDE_BUILD_TREE/_release86
    }
}
macx:CONFIG(debug, debug|release){
    DESTDIR = $$IDE_BUILD_TREE/_debug64
} else:macx:CONFIG(release, debug|release){
    DESTDIR = $$IDE_BUILD_TREE/_release64
}      

2.2 建立一個動态庫項目,pro檔案這樣寫:

include(../common.pri)

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TEMPLATE = lib

TARGET = $$qtLibraryName(ribbonTabbar)

如此一來,debug生成的lib檔案名就是ribbonTabbard.lib和ribbonTabbard.dll,自動添加了字尾"d"

2.3 最後建立一個exe主程式項目,想引入該動态庫的話,可以在pro檔案這樣寫:

IDE_LIBRARY_PATH = $${DESTDIR}

#大寫的L表示路徑;小寫的l表示庫檔案

LIBS += -L$${IDE_LIBRARY_PATH}

LIBS *= -l$$qtLibraryName(ribbonTabbar)

LIBS *= 和LIBS += 是同樣的意思。

-L表示後面跟的是一個檔案夾,工程會将這個目錄加入庫檔案搜尋路徑中。

-l表示後面跟的是一個庫檔案的名字。不論字尾是.lib、.dll、.so、.a,都不需要加上字尾名,直接用庫的點分号前面部分名字即可。

2.4 32位和64位區分

contains(DEFINES, 32bit) {
INCLUDEPATH += $$PWD/include
} else {
INCLUDEPATH += $$PWD/include64
}
contains(DEFINES, WIN64) {
INCLUDEPATH += $$PWD/include64
} else {
INCLUDEPATH += $$PWD/include
}      

3、姊妹篇

歡迎通路姊妹篇《Qt Creator指定臨時檔案生成目錄(MOC_DIR/RCC_DIR等)和PWD/OUT_PWD/.pro官方文檔》

歡迎通路姊妹篇《關于Qt Creator項目中.pro檔案中的相對路徑》

繼續閱讀