qmake 乱乱乱谈(四)

继续qmake,本文主题:低调的 TEMPLATE = subdirs

非常非常常用的一个东西,可是manual中却介绍的很少,太低调了。在编写包含多可执行文件、库、插件 的程序时,一直不敢相信subdirs的能力,以至于曾一度想转到cmake之下。

Manual

Manual 中对 TEMPLATE = subdirs 的介绍实在简单:

  • Creates a Makefile containing rules for the subdirectories specified using theSUBDIRSvariable. Each subdirectory must contain its own project file.

相当长一段时间,自己都是按Manual中的说法进行使用的:

  • 工程的一般结构

|-- project.pro
      |-- app\
      |     `-- app.pro
      |-- lib1\
      |     `-- lib1.pro
      |-- lib2\
      |     `-- lib2.pro
      `-- tests\
            |-- tests.pro
            |-- test1\
            |     `-- test1.pro
            |-- test2\
                  `-- test2.pro
  • project.pro 的内容

TEMPLATE  = subdirs
SUBDIRS = lib1 lib2 app tests
  • tests/tests.pro 的内容

TEMPLATE  = subdirs 
SUBDIRS = test1 test2

一切看起来都很自然。subdirs,顾名思义,SUBDIRS 中指定的就是一个个的子目录呗。真是如此么?

.file

SUBDIRS 中指定的是一个个的子目录来理解,很快有个问题:

每个子目录下的工程文件必须和子目录同名!可是,万一不同名又如何解决呢??

  • 比如:

|-- project.pro
      |-- app\
      |     `-- hello.pro
      |-- lib1\
      |     `-- libwidget.pro
      `-- lib2\
            `-- libtools.pro

恩,这时就该.file出场了!

  • project.pro 内容

TEMPLATE  = subdirs
SUBDIRS = lib1 lib2 app
app.file = hello.pro
lib1.file = lib1/libwidget.pro
lib2.file = lib2/libtools.pro

恩,直到这时,SUBDIRS 中指定的还都是目录名,仍然没什么问题。可是,在看到.file不久,就发现了.subdir

.subdir

这个东西实在不好理解了,比如,下面的结构:

|-- project.pro
      |-- app\
      |     `-- app.pro
      `-- lib1\
            `-- lib1.pro
  • project.pro 内容可以写作如下:

TEMPLATE  = subdirs
SUBDIRS = my_lib1 my_app
my_lib1.subdir = lib1
my_app.subdir = app

这样一来,SUBDIRS 后面的东西,完全不是目录名了,而是任意一个名字!

.file 与 .subdir

有了上面两个之后,容易想到的就是:?

  • 取一个名字,加入到 SUBDIRS
  • 通过.subdir 给它指定子目录名字
  • 通过.file 给它指定pro工程的名字

比如:

|-- project.pro
      |-- app\
      |     `-- hello.pro
      `-- lib1\
            `-- lib1.pro

project.pro是否可以这么写呢?

TEMPLATE  = subdirs
SUBDIRS = lib1 my_app
my_app.subdir = app
my_app.file = app/hello.pro

可是,这么却不会工作。不能同时指定 .subdir 和 .file!那怎么办呢?

  • 去掉 .file? 显然不行,它需要 app 目录下有 app.pro 文件
  • 去掉 .subdir呢?试试看

TEMPLATE  = subdirs
SUBDIRS = lib1 my_app
my_app.file = app/hello.pro

啊?还真可以了!

怎么回事?现在不光 SUBDIRS 后面指定的不是目录,后面也不需要 .subdir 来指定目录了。

看来,SUBDIRS是严重的名不副实了!

故事还没完

还是这个例子:

|-- project.pro
      |-- app\
      |     `-- hello.pro
      `-- lib1\
            `-- lib1.pro
  • project.pro 可以直接写作

TEMPLATE  = subdirs
SUBDIRS = lib1 app/hello.pro

我们可以直接指定pro工程名!

继续?

恩,不需要每个目录都用一个pro文件

|-- project.pro
      |-- app\
      |     `-- app.pro
      |-- lib1\
      |     `-- lib1.pro
      |-- lib2\
      |     `-- lib2.pro
      `-- tests\
            |-- test1\
            |     `-- test1.pro
            |-- test2\
                  `-- test2.pro
  • project.pro 文件内容

TEMPLATE  = subdirs
SUBDIRS = app lib1 lib2 tests/test1 tests/test2/test2.pro

恩,这样似乎又回归简单了。只需简单指定目录或pro文件路径即可。

少点什么?

恩,下面5个之中,我们只提到了2个(最后2个本人没用到过,也不清楚具体用途)

  • subdir
  • file
  • depends
  • makefile
  • target

不过中间的depends还是很有用的

TEMPLATE  = subdirs
SUBDIRS = app lib1 lib2
app.depends = lib1 lib2

参考


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值