接前面的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 乱乱乱谈(三)相关推荐

  1. 移动式护栏巡逻机器人_重磅!移动式护栏巡逻执法机器人上岗!专盯高速乱停乱行!...

    在高速公路上行车 因为速度很快 所以千万不能乱停乱行 搞不好就让你万箭穿心 针对各种高速违法行为 又一执法神器上线 移动式护栏巡逻执法机器人 眼前这个小盒子,正是这款"移动式护栏巡逻执法机器 ...

  2. 对共享单车乱停乱放说不:首个电子围栏技术要求发布

    每次走出小区或者地铁,看到路边乱停乱放甚至是堆成小山似的共享单车,您是否也会和我一样发出一声叹息? 幸运的是,随着全国首个共享单车电子围栏技术要求的发布,这一乱象有望得到有效整治. 2018年3月22 ...

  3. 共享单车用完乱停乱放怎么办?“电子围栏” 来帮忙

    共享单车给市民带来便利的同时,乱停乱放却成了非常难以解决的问题.针对这种情况,上海市率先与小鸣单车合作,在晋元路上设置了国内首个针对共享单车的"电子围栏". 共享单车给市民带来便利 ...

  4. 计算机屏幕画面乱动如何解决,电脑屏幕不受控制乱跳怎么回事 电脑屏幕乱闪乱跳的处理方法...

    在当今的互联网时代,电脑设备已经算是比较普遍了,在使用过程中难免遇到一点小问题.有些网友留言说自己新电脑屏幕经常出现闪烁或者跳动的情况,出现此问题可能是显卡故障,有的时候纯粹是设置问题.不管什么原因, ...

  5. 机动车乱停乱放检测系统(源码&部署教程)

    1.识别效果展示 2.视频演示 [YOLOv7]基于YOLOv7的机动车乱停乱放检测系统(源码&部署教程)_哔哩哔哩_bilibili 3.YOLOv7算法简介 YOLOv7 在 5 FPS ...

  6. 浅谈三角带的使用及其分类

    浅谈三角带的使用及其分类 特殊加工传送带http://www.gardner-js.com/csd.html三角带又称V型带,是传动带中产量最大.品种最多.用途最广的一种产品.自从1917年首次由美国 ...

  7. 浅谈三次数学危机——费马大定理

    浅谈三次数学危机--费马大定理 19世纪末20世纪初,随着非欧几里得几何.无穷小分析等领域的迅速发展,数学界面临着前所未有的挑战.这场关于数学基础的争论,被称为"数学危机".数学危 ...

  8. (一)永磁同步电机矢量控制(三电平)——浅谈三电平逆变器

      由于前几天比较忙,这期更新有点迟了!!不过没关系,在新的章节会保持每周更新1~2篇博文. 0 前言 这期我们开始新的章节--永磁同步电机矢量控制(三电平). 记得前两三周我在做三电平的PMSM矢量 ...

  9. 严格模式 华为_华为千元机虽然好,但是千万别乱选,这三款才是内行人的最爱...

    现在5G高端旗舰代表着厂商的技术水平,不过这些5G旗舰相比而言创造的收益却比较少,而大部分的效益是由5G中端机和5G千元机创造. 进入20年后,华为也开始在千元手机市场上发力,其中有三款5G千元机配置 ...

最新文章

  1. R语言使用dplyr将特定的数据列移动到最前面、使用dplyr将特定数据列移动到另一指定数据列的后面、使用dplyr将特定数据列移动到另一指定数据列的前面
  2. 黑马程序员--java基础--其他对象
  3. 《途客圈创业记:不疯魔,不成活》一一1.6 申请助跑计划
  4. windows窗口移动到屏幕外,找回方法
  5. 技巧分享 PDF如何删除数字签名
  6. 苹果录屏没声音_不会真有人MacBook录屏没声音吧?别用了SoundFlower了!
  7. scala练习——fold函数
  8. Linux ora-12514多实例,ORA-12514: 错误的解决
  9. Python爬虫之网易云音乐数据爬取(十五)
  10. HTML5之 Microdata微数据
  11. 盐于律己,甜以待人(*╹▽╹*)
  12. 用Unity制作一个很火的找不同游戏,包括核心玩法与关卡编辑器工具的实现
  13. 深入理解Java内存模型(JMM和volatile关键词)
  14. 缩减openssl库体积
  15. 计算机专业英语中tour的意思,计算机专业英语自我介绍
  16. 怎么做一名合格的测试工程师
  17. hadoop查看文件总条数及按某个关键词查询
  18. 使用雪碧图Css Sprite精灵 | 加速网页响应速度
  19. 计算机毕业设计ssmAI学院教务信息管理系统lx9v9系统+程序+源码+lw+远程部署
  20. onenote连接网络失败,无法创建新的笔记

热门文章

  1. 计算机32位怎么转换为64位,CAD2014 32位怎么转换成64位
  2. 如何向别人介绍你做的东西
  3. 第十一周 日期算星座
  4. JVAV组件--系统框架--JIDE Action Framework
  5. 智能的逻辑与理性的逻辑是不同的逻辑
  6. day01(Flume)
  7. (整理)蓝屏代码对应原因_蓝屏问题解决方法
  8. 为什么用恒流电源驱动LED灯具
  9. 【SpringBoot搭建个人博客】- 相册管理(九)
  10. 相机删除自动闪光灯。桌面删除搜索框(google)等。预置应用可卸载。