现在的位置: 首页 > 自动控制 > 工业·编程 > 正文

qmake 乱乱乱谈(四)

2015-05-09 06:56 工业·编程 ⁄ 共 2196字 ⁄ 字号 暂无评论

继续《qmake 乱乱乱谈(三),本文主题:低调的 TEMPLATE = subdirs

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

Manual

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

  • Creates a Makefile containing rules for the subdirectories specified using the SUBDIRS variable. 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
作者:dbzhang800

给我留言

留言无头像?