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

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

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

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

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;
}

最佳答案

由于您在相同的构建目录中构建库,具有相同的目标名称,因此无论当前的构建配置如何设置,您总是会得到最新构建的文件。 为了克服这个问题,您需要使用单独的构建目录,每个配置一个。

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

/somepath/example/%{CurrentBuild:Name}

清理当前的构建目录,然后重新构建每个配置。给定 AB 您的配置名称,您应该得出这样的目录树:

- somepath 

  - example

    - A                         
      + app
      + my_lib

    - B                         
      + app
      + my_lib

关于c++ - qmake - 未检测到配置更改并且库未重新编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54089151/

相关文章:

qt - QVBoxLayout : How to align widgets to the top using Qt designer

python - 如何在qt设计器中将函数连接到qt小部件? - Python

c++ - 如何将我的应用静态链接到 ICU 57.1 MinGW

c++ - 如何在 Qt Creator 中配置 CDB?

c++ - 如何让选项卡控件接管 Qt Creator 中的整个窗口?

c++ - OpenCV (c++) 多 channel 元素访问

c++ - 由于早期版本的先前安装,Makefile无法安装代码

qt - 如何更新 CMake Qt 项目中的 *.ts(用于 Qt Linguist)文件?

c++ - 使用 c++(SDL2) 的突破游戏 - 试图让球改变轨迹但有一些问题

C++ 自纪元以来给定小时和分钟的秒数