qmake - 未检测到配置更改并且库未重新编译
qmake - changes in configuration are not detected and the library doesn't recompile
我想根据配置选择编译成静态库的文件
为此,我在 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;
}
由于您在同一个构建目录中构建库,具有相同的目标名称,无论当前的构建配置如何设置,您总是会得到最新构建的文件。
要解决这个问题,您需要使用单独的构建目录,每个配置一个。
在构建设置中,对于每个配置,在构建的末尾添加%{CurrentBuild:Name}
目录 路径:
/somepath/example/%{CurrentBuild:Name}
清理您当前的构建目录,然后重新构建每个配置。给定 A 和 B 你的配置名称,你应该得到这样的目录树:
- somepath
- example
- A
+ app
+ my_lib
- B
+ app
+ my_lib
我想根据配置选择编译成静态库的文件
为此,我在 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;
}
由于您在同一个构建目录中构建库,具有相同的目标名称,无论当前的构建配置如何设置,您总是会得到最新构建的文件。 要解决这个问题,您需要使用单独的构建目录,每个配置一个。
在构建设置中,对于每个配置,在构建的末尾添加%{CurrentBuild:Name}
目录 路径:
/somepath/example/%{CurrentBuild:Name}
清理您当前的构建目录,然后重新构建每个配置。给定 A 和 B 你的配置名称,你应该得到这样的目录树:
- somepath
- example
- A
+ app
+ my_lib
- B
+ app
+ my_lib