qmake 乱乱乱谈(三)
接前面的qmake 乱乱乱谈(一)以及qmake 乱乱乱谈(二),本文看看qmake中的函数(Manual中有的就不重复了)。
函数分两种:
内置函数 (qmake Manual中列出的属于此类)
- 自定义函数 (通过defineReplace或defineTest定义)
函数还可以分两种(真不知道怎么叙述):
- 返回值是布尔量的函数。(或者称为条件函数?)
- 内置函数中的 system()、exists()等用作条件的函数
- 内置函数中的 error()、return()、export()等不用做条件的函数
- 使用defineTest()定义的函数
- 函数调用时,前面不加 $$
- 以进行数据处理为目的的函数?返回值是处理结果。
- 内置函数中的dirname()、join()等
- 使用defineReplace()定义的函数
- 函数调用时,前面加 $$
函数用法
加不加$$ ?
前面提到,两类函数中,
- 一类前面不加$$,比如下面的exists和message
exists( $(QTDIR)/lib/libqt-mt* ) { message( "Configuring for multi-threaded Qt..." ) CONFIG += thread }
- 另一类前面要加 $$,比如下面的 basename
FILE = /etc/passwd FILENAME = $$basename(FILE) #passwd
可是有没有疑问?
疑问?
system 有两种用法:
- 不加 $$
system(ls /bin):HAS_BIN=FALSE
- 加 $$
UNAME = $$system(uname -s)
莫不是我们前面说的都是错的!!!
在看源码之前一直没搞清楚到底怎么回事。原来,有两个system函数,分别属于前面的两类。
- 前者,调用C语言的system函数,判断返回值是否为零
case T_SYSTEM: if(args.count() < 1 || args.count() > 2) { fprintf(stderr, "%s:%d: system(exec) requires one argument.\n", parser.file.toLatin1().constData(), parser.line_no); return false; } if(args.count() == 2) { const QString sarg = args[1]; if (sarg.toLower() == "true" || sarg.toInt()) warn_msg(WarnParser, "%s:%d: system()'s second argument is now hard-wired to false.\n", parser.file.toLatin1().constData(), parser.line_no); } return system(args[0].toLatin1().constData()) == 0;
后者,调用linux下的popen()或windows下的_popen()函数。返回其标准输出!
case E_SYSTEM: { if(args.count() < 1 || args.count() > 2) { fprintf(stderr, "%s:%d system(execut) requires one argument.\n", parser.file.toLatin1().constData(), parser.line_no); } else { char buff[256]; bool singleLine = true; if(args.count() > 1) singleLine = (args[1].toLower() == "true"); QString output; FILE *proc = QT_POPEN(args[0].toLatin1(), "r"); while(proc && !feof(proc)) { int read_in = int(fread(buff, 1, 255, proc)); if(!read_in) break; for(int i = 0; i < read_in; i++) { if((singleLine && buff[i] == '\n') || buff[i] == '\t') buff[i] = ' '; } buff[read_in] = '\0'; output += buff; } ret += split_value_list(output); if(proc) QT_PCLOSE(proc); } break; }
自定义函数
看例子:定义的两个函数都是叫func1,但类型不同
- test.pro
defineReplace(func1){ variable = $$1 message(replace_func $$variable) return (variable) } defineTest(func1){ variable = $$1 message(test_func $$variable) return (true) } NAME = dbzhang800 func1($$NAME):message(success) ABC = $$func1($$NAME)
- 运行qmake的结果如下:
Project MESSAGE: test_func dbzhang800 Project MESSAGE: success Project MESSAGE: replace_func dbzhang800
例子
- 看一个比较常用的(Qt feature文件中提供的)自定义函数:qtLibraryTarget
defineReplace(qtLibraryTarget) { unset(LIBRARY_NAME) LIBRARY_NAME = $$1 contains(TEMPLATE, .*lib):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) }
为调试版的库文件添加_debug或d后缀!
例子
函数内的如何获取参数:
- 似乎 $$1 和 $$ARGS 完全等价
defineReplace(func1){ message(\$\$1 $$1) message(\$\$ARGS $$ARGS) for(v, 1){ message($$v) } for(v, ARGS){ message($$v) } return ($$1) } NAME = dbzhang800 dbzhang801 dbzhang802 ABC = $$func1($$NAME) #两个参数的要这么写(逗号不同于空格),然后,用$$2获取第二个参数,$$ARGS获取全部 #ABCD = $$func1($$NAME, $$NAME)
- 结果
Project MESSAGE: $$1 dbzhang800 dbzhang801 dbzhang802 Project MESSAGE: $$ARGS dbzhang800 dbzhang801 dbzhang802 Project MESSAGE: dbzhang800 Project MESSAGE: dbzhang801 Project MESSAGE: dbzhang802 Project MESSAGE: dbzhang800 Project MESSAGE: dbzhang801 Project MESSAGE: dbzhang802
参考
http://doc.qt.nokia.com/4.7/qmake-advanced-usage.html
http://doc.qt.nokia.com/4.7/qmake-function-reference.html
http://www.qtcentre.org/wiki/index.php?title=Undocumented_qmake
qmake 乱乱乱谈(三)相关推荐
- 移动式护栏巡逻机器人_重磅!移动式护栏巡逻执法机器人上岗!专盯高速乱停乱行!...
在高速公路上行车 因为速度很快 所以千万不能乱停乱行 搞不好就让你万箭穿心 针对各种高速违法行为 又一执法神器上线 移动式护栏巡逻执法机器人 眼前这个小盒子,正是这款"移动式护栏巡逻执法机器 ...
- 对共享单车乱停乱放说不:首个电子围栏技术要求发布
每次走出小区或者地铁,看到路边乱停乱放甚至是堆成小山似的共享单车,您是否也会和我一样发出一声叹息? 幸运的是,随着全国首个共享单车电子围栏技术要求的发布,这一乱象有望得到有效整治. 2018年3月22 ...
- 共享单车用完乱停乱放怎么办?“电子围栏” 来帮忙
共享单车给市民带来便利的同时,乱停乱放却成了非常难以解决的问题.针对这种情况,上海市率先与小鸣单车合作,在晋元路上设置了国内首个针对共享单车的"电子围栏". 共享单车给市民带来便利 ...
- 计算机屏幕画面乱动如何解决,电脑屏幕不受控制乱跳怎么回事 电脑屏幕乱闪乱跳的处理方法...
在当今的互联网时代,电脑设备已经算是比较普遍了,在使用过程中难免遇到一点小问题.有些网友留言说自己新电脑屏幕经常出现闪烁或者跳动的情况,出现此问题可能是显卡故障,有的时候纯粹是设置问题.不管什么原因, ...
- 机动车乱停乱放检测系统(源码&部署教程)
1.识别效果展示 2.视频演示 [YOLOv7]基于YOLOv7的机动车乱停乱放检测系统(源码&部署教程)_哔哩哔哩_bilibili 3.YOLOv7算法简介 YOLOv7 在 5 FPS ...
- 浅谈三角带的使用及其分类
浅谈三角带的使用及其分类 特殊加工传送带http://www.gardner-js.com/csd.html三角带又称V型带,是传动带中产量最大.品种最多.用途最广的一种产品.自从1917年首次由美国 ...
- 浅谈三次数学危机——费马大定理
浅谈三次数学危机--费马大定理 19世纪末20世纪初,随着非欧几里得几何.无穷小分析等领域的迅速发展,数学界面临着前所未有的挑战.这场关于数学基础的争论,被称为"数学危机".数学危 ...
- (一)永磁同步电机矢量控制(三电平)——浅谈三电平逆变器
由于前几天比较忙,这期更新有点迟了!!不过没关系,在新的章节会保持每周更新1~2篇博文. 0 前言 这期我们开始新的章节--永磁同步电机矢量控制(三电平). 记得前两三周我在做三电平的PMSM矢量 ...
- 严格模式 华为_华为千元机虽然好,但是千万别乱选,这三款才是内行人的最爱...
现在5G高端旗舰代表着厂商的技术水平,不过这些5G旗舰相比而言创造的收益却比较少,而大部分的效益是由5G中端机和5G千元机创造. 进入20年后,华为也开始在千元手机市场上发力,其中有三款5G千元机配置 ...
最新文章
- R语言使用dplyr将特定的数据列移动到最前面、使用dplyr将特定数据列移动到另一指定数据列的后面、使用dplyr将特定数据列移动到另一指定数据列的前面
- 黑马程序员--java基础--其他对象
- 《途客圈创业记:不疯魔,不成活》一一1.6 申请助跑计划
- windows窗口移动到屏幕外,找回方法
- 技巧分享 PDF如何删除数字签名
- 苹果录屏没声音_不会真有人MacBook录屏没声音吧?别用了SoundFlower了!
- scala练习——fold函数
- Linux ora-12514多实例,ORA-12514: 错误的解决
- Python爬虫之网易云音乐数据爬取(十五)
- HTML5之 Microdata微数据
- 盐于律己,甜以待人(*╹▽╹*)
- 用Unity制作一个很火的找不同游戏,包括核心玩法与关卡编辑器工具的实现
- 深入理解Java内存模型(JMM和volatile关键词)
- 缩减openssl库体积
- 计算机专业英语中tour的意思,计算机专业英语自我介绍
- 怎么做一名合格的测试工程师
- hadoop查看文件总条数及按某个关键词查询
- 使用雪碧图Css Sprite精灵 | 加速网页响应速度
- 计算机毕业设计ssmAI学院教务信息管理系统lx9v9系统+程序+源码+lw+远程部署
- onenote连接网络失败,无法创建新的笔记