本篇讲解在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)
defineReplace(func)
{
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文件这样写:
include(../common.pri)
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位区分
3、姊妹篇
欢迎访问姊妹篇《Qt Creator指定临时文件生成目录(MOC_DIR/RCC_DIR等)和PWD/OUT_PWD/.pro官方文档》
欢迎访问姊妹篇《关于Qt Creator项目中.pro文件中的相对路径》