在 Qt 中使用不同的模板构建目标

Build targets with different templates in Qt

您好,我对 Qt 比较陌生,到目前为止我找不到可行的解决方案。我有以下项目结构

ALPHA-app
    alpha.pro
    ALPHA-Desktop
        alpha-desktop.pro
    ALPHA-Shared
        alpha-shared.pro
    ALPHA-Common
        alpha-common.pro
    ALPHA-Tests
        alpha-tests.pro

我基本上必须 运行 alpha.pro 构建所有项目并创建可执行文件

alpha.pro,

TEMPLATE = subdirs
DESTDIR = .
SUBDIRS += \
    ALPHA-Common \
    ALPHA-Shared \
    ALPHA-Desktop \
    ALPHA-Tests

ALPHA-Desktop.depends = ALPHA-Common
ALPHA-Shared.depends = ALPHA-Common
ALPHA-Tests.depends = ALPHA-Common
ALPHA-Tests.depends = ALPHA-Desktop

将成为 运行 的主要可执行文件存在于 ALPHA-Desktop 项目中(如下所示)

TARGET = ALPHA #this is in ALPHA-Deskop.pro
TEMPLATE = app

现在我创建了 ALPHA-Tests 来制作一个 运行 单元测试的项目。它依赖于 ALPHA-Desktop(因此我在 ALPHA 项目中写了 .depends 语句)

为了 运行 ALPHA-Tests,我需要创建一个 ALPHA-Desktop 文件夹的静态库。因此,我在 ALPHA-Desktop.pro 文件

中写了以下几行
TARGET = ALPHA-Desktop #section 1
TEMPLATE = lib         #section 1
CONFIG += staticlib    #section 1

TARGET = ALPHA         #section 2
TEMPLATE = app         #section 2

当我 运行 ALPHA.pro 文件时,未创建 ALPHA-Desktop 库。仅创建 ALPHA 可执行文件。如果我交换位置(即,将第 2 节放在第 1 节上方),则只会创建 libALPHA-Desktop.a 文件,而不会创建可执行文件。

我该如何解决这个问题? (我在 ubuntu 15.10 上使用 qmake 3.0 版,Qt 5.4.2 版)

TEMPLATE、TARGET 等对于一个 .pro 文件始终是全局的。虽然这从未在 qmake documentation 中明确说明,但一旦您意识到 qmake 语法的目标是声明性的,这一点就很明显了。最后一行设置变量将始终为准(除非您通过命令行覆盖变量)。

如果你想创建一个静态库和一个可执行文件,你需要有两个 .pro 文件(可能再次与子目录 .pro 文件集成)。

请注意,这并不一定意味着您需要不同的子目录,因为多个 .pro 文件也可以存在于同一目录中:

阿尔法-Desktop.pro:

TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += ALPHA-Desktop-staticlib.pro ALPHA-Desktop-app.pro 

ALPHA-桌面-staticlib.pro:

TEMPLATE = lib
CONFIG += static
# ...

ALPHA-桌面-app.pro:

TEMPLATE = app
# ...