qmake-未检测到配置更改,并且库未重新编译

时间:2019-01-08 09:50:49

标签: c++ qt qt-creator qmake build-system

我想根据配置选择编译到静态库中的文件。

为此,我在QtCreator的“项目”选项卡中创建了两个配置(A和B),并在我的.pro文件中创建了

CONFIG(USE_A){
    SOURCES += My_lib_a.cpp
}
CONFIG(USE_B){
    SOURCES += My_lib_b.cpp
}

它可以工作,但是有问题。

当我两次在A和B配置之间进行切换时,两个版本都构建完成后,qmake不再检测到有任何更改,并且该库停留在旧文件中。 我被迫触摸要重新编译的文件,或者手动选择重建库。

我已经检查了Qt 5.12和msvc 2017,但是我需要在Windows和Linux上使用它。

这是这样做的正确方法吗? 有办法解决这个问题吗?

最小示例:

// example/top.pro
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += \
    my_lib\
    app

// example/app/app.pro
TARGET = app
SOURCES += main.cpp
INCLUDEPATH += ../my_lib
DEPENDPATH += ../my_lib
LIBS += -L../my_lib/debug -lmy_lib
PRE_TARGETDEPS += ../my_lib/debug/my_lib.lib

// example/app/main.cpp
#include "My_lib.h"
int main()
{
    My_lib m;
}

// example/my_lib/my_lib.pro
TARGET = my_lib
TEMPLATE = lib
CONFIG += staticlib
CONFIG(USE_A){
    SOURCES += My_lib_a.cpp
}
CONFIG(USE_B){
    SOURCES += My_lib_b.cpp
}
HEADERS += My_lib.h

// example/my_lib/My_lib.h
#pragma once
struct My_lib
{
    My_lib();
};

// example/my_lib/My_lib_a
#include "My_lib.h"
#include <iostream>
My_lib::My_lib()
{
    std::cout << "This is A" << std::endl;
}

// example/my_lib/My_lib_b
#include "My_lib.h"
#include <iostream>
My_lib::My_lib()
{
    std::cout << "This is B" << std::endl;
}

1 个答案:

答案 0 :(得分:1)

由于使用相同的目标名称在相同的构建目录中构建库,因此无论当前的构建配置设置为什么,您都将始终获得最新的构建文件。 为了解决该问题,您需要使用单独的构建目录,每种配置一个。

构建设置中,对于每个配置 ,在构建目录路径的末尾添加%{CurrentBuild:Name}

/somepath/example/%{CurrentBuild:Name}

清理当前的构建目录,然后再次构建每个配置。给定 A B 您的配置名称,您将收到如下目录树:

- somepath 

  - example

    - A                         
      + app
      + my_lib

    - B                         
      + app
      + my_lib