Qt Creator按顺序编译多个子项目

发布时间 2023-05-24 15:17:58作者: 一杯清酒邀明月

0. 环境

Qt5.3.2 mingw482_32

1. 创建子项目

这个子项目类似于Visual Studio中解决方案一样的存在,用于管理多个其他子项目。点击文件->新建文件或项目->其他项目->子项目项目->Choose

之后下一步,选择需要的编译器,我这里只有mingw,若有msvc编译器也可选择msvc,不同的编译器生成的静态库文件后缀名不一样,mingw后缀为.a,msvc后缀为.lib。

2. 创建SubProjectSln的子项目

  1. UiApp
  2. Dll
  3. Lib

在SubProjectSln项目上新建子项目,操作如下,其他类同:

 创建完成后项目目录结构如下:

 其中SubProjectSln的项目文件内容如下:

1 TEMPLATE = subdirs
2 
3 SUBDIRS += \
4     UiApp \
5     Dll \
6     Lib

这里最主要的就是这个项目文件

  • TEMPLATE不为subdirsSubProjectSln就不能创建子项目
  • SUBDIRS的项目顺序默认就是构建的顺序。

3. 三个项目内容

Dll依赖 LibUiApp依赖Dll

3.1 Dll

Dll主要内容如下:

 1 #include "dll.h"
 2 #include "../lib/lib.h"
 3 
 4 Dll::Dll()
 5 {
 6 
 7 }
 8 
 9 QString Dll::getDllName()
10 {
11     return "Dll";
12 }
13 
14 QString Dll::getLibName()
15 {
16     Lib lib;
17     return lib.getName();
18 }

Dll项目文件如下:

 1 #-------------------------------------------------
 2 #
 3 # Project created by QtCreator 2022-08-28T16:51:01
 4 #
 5 #-------------------------------------------------
 6 
 7 QT       -= gui
 8 
 9 TARGET = Dll
10 TEMPLATE = lib
11 
12 DEFINES += DLL_LIBRARY
13 
14 CONFIG(debug,debug|release){
15     DESTDIR = ../bin/debug
16     LIBS += ../bin/debug/libLib.a
17 } else {
18     DESTDIR = ../bin/release
19     LIBS += ../bin/release/libLib.a
20 }
21 
22 SOURCES += dll.cpp
23 
24 HEADERS += dll.h\
25         dll_global.h
26 
27 unix {
28     target.path = /usr/lib
29     INSTALLS += target
30 }

3.2 Lib

Lib主要内容如下:

 1 #include "lib.h"
 2 
 3 
 4 Lib::Lib()
 5 {
 6 }
 7 
 8 QString Lib::getName()
 9 {
10     return "Lib";
11 }

Lib项目文件内容如下:

 1 #-------------------------------------------------
 2 #
 3 # Project created by QtCreator 2022-08-28T16:51:22
 4 #
 5 #-------------------------------------------------
 6 
 7 QT       -= gui
 8 
 9 TARGET = Lib
10 TEMPLATE = lib
11 CONFIG += staticlib
12 
13 CONFIG(debug,debug|release){
14     DESTDIR = ../bin/debug
15 } else {
16     DESTDIR = ../bin/release
17 }
18 
19 SOURCES += lib.cpp
20 
21 HEADERS += lib.h
22 unix {
23     target.path = /usr/lib
24     INSTALLS += target
25 }

3.3 UiApp

UiApp界面如下:

 UiApp界面代码如下:

 1 #include "widget.h"
 2 #include "ui_widget.h"
 3 #include "../Dll/dll.h"
 4 
 5 Widget::Widget(QWidget *parent) :
 6     QWidget(parent),
 7     ui(new Ui::Widget)
 8 {
 9     Dll dll;
10     ui->setupUi(this);
11     ui->dllLabel->setText(dll.getDllName());
12     ui->libLabel->setText(dll.getLibName());
13 }
14 
15 Widget::~Widget()
16 {
17     delete ui;
18 }

UiApp项目文件如下:

 1 #-------------------------------------------------
 2 #
 3 # Project created by QtCreator 2022-08-28T16:50:24
 4 #
 5 #-------------------------------------------------
 6 
 7 QT       += core gui
 8 
 9 greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
10 
11 TARGET = UiApp
12 TEMPLATE = app
13 
14 CONFIG(debug,debug|release){
15     DESTDIR = ../bin/debug
16     LIBS += ../bin/debug/Dll.dll
17 } else {
18     DESTDIR = ../bin/release
19     LIBS += ../bin/release/Dll.dll
20 }
21 
22 
23 SOURCES += main.cpp\
24         widget.cpp
25 
26 HEADERS  += widget.h
27 
28 FORMS    += widget.ui

4. 构建

以如下顺序构建:

这里的错误就是因为UiApp依赖了Dll,所以构建的顺序颠倒了。

修改SubProjectSln项目文件如下:

1 TEMPLATE = subdirs
2 
3 SUBDIRS += \
4     Lib \
5     Dll \
6     UiApp

即可构建成功。

我网上查资料有的说要在SubProjectSln项目文件中加CONFIG += ordered,使SUBDIRS按照顺序构建,但是我测试下来不加CONFIG += ordered,也是按照顺序构建的,猜测可能是版本的原因~~~

运行结果如下: