Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt中使用不同的模板构建目标_C++_Qt_Makefile_Static Libraries_Qmake - Fatal编程技术网

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

C++ 在Qt中使用不同的模板构建目标,c++,qt,makefile,static-libraries,qmake,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.pr

嗨,我对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桌面项目中(如下所示)

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

要运行ALPHA测试,我需要创建ALPHA桌面文件夹的静态库。因此,我在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桌面。创建文件,而不创建可执行文件


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

模板、目标等始终是一个.pro文件的全局文件。虽然在中从未明确说明这一点,但一旦您意识到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
# ...

对于这种设置,我建议您切换到CMake。我总是在尝试使用qmake做类似的事情时遇到问题。CMake还有子项目的概念——不同之处在于它实际上工作正常。QtCreator还支持开箱即用的CMake。我需要使用qmake。使用qmake不可能做到这一点吗?我不认为您可以像在ALPHA-Desktop.pro中那样在一个.pro文件中构建多个目标。第二个目标=。。。始终覆盖上一个目标=。。。你应该以某种方式重新安排…也许你可以在一个单独的.pro文件中构建静态库并将其添加到子目录中?事实上,我对同一文件中的多个目标的看法是错误的,请检查以下内容:然而,我仍然不确定是否可以同时生成两个配置。qmake将不允许您在同一个.pro文件中创建两个目标,除非您明确使用条件生成,如上面注释中的链接所示。在这种情况下,我建议使用两个.pro文件(和subdir)-一个用于静态桌面库,一个用于最终桌面应用程序,第二个仅编译main.cpp和第一步编译的库的链接。使用这种方法,您可以根据需要使用桌面库构建尽可能多的应用程序-只需为每个应用程序(您的案例中的主应用程序和测试)创建新的subdir和.pro。当一个目录中存在多个.pro文件时,qmake如何知道在迭代SUBDIRS时使用哪个文件?它不使用与目录名相同的.pro文件吗?您也可以直接在子目录中列出.pro文件。扩展了答案。我不知道我们可以添加多个项目文件。谢谢
TEMPLATE = app
# ...