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

时间:2016-03-18 16:40:57

标签: c++ qt makefile static-libraries qmake

您好我对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)

1 个答案:

答案 0 :(得分:2)

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

如果要创建静态库和可执行文件,则需要有两个.pro文件(可能再次与子目录.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
# ...