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

Build targets with different templates in Qt

本文关键字:构建 目标 Qt      更新时间:2023-10-16

嗨,我对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 测试来创建一个运行单元测试的项目。它取决于 ALPHA-Desktop(因此我在 ALPHA 项目中编写了 .depends 语句)

要运行 ALPHA 测试,我需要创建 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 桌面库。仅创建 ALPHA 可执行文件。如果我交换位置(即将第 2 节放在第 1 节上方),则仅创建 libALPHA-Desktop.a 文件,而不会创建可执行文件。

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

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

如果要创建静态库和可执行文件,则需要两个 .pro 文件(可能再次与 subdirs .pro 文件集成)。

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

ALPHA-Desktop.pro:

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

ALPHA-Desktop-staticlib.pro:

TEMPLATE = lib
CONFIG += static
# ...

ALPHA-Desktop-app.pro:

TEMPLATE = app
# ...