QT|QtCreator按顺序编译多个子项目


QtCreator按顺序编译多个子项目

  • 0. 环境
  • 1. 创建子项目
  • 2. 创建SubProjectSln的子项目
  • 3. 三个项目内容
    • 3.1 Dll
    • 3.2 Lib
    • 3.3 UiApp
  • 4. 构建

0. 环境
  1. Qt5.3.2 mingw482_32
1. 创建子项目 这个子项目类似于Visual Studio中解决方案一样的存在,用于管理多个其他子项目。点击文件->新建文件或项目->其他项目->子项目项目->Choose
QT|QtCreator按顺序编译多个子项目
文章图片

之后下一步,选择需要的编译器,我这里只有mingw,若有msvc编译器也可选择msvc,不同的编译器生成的静态库文件后缀名不一样,mingw后缀为.amsvc后缀为.lib
2. 创建SubProjectSln的子项目
  1. UiApp
  2. Dll
  3. Lib
SubProjectSln项目上新建子项目,操作如下,其他类同:
QT|QtCreator按顺序编译多个子项目
文章图片

创建完成后项目目录结构如下:
QT|QtCreator按顺序编译多个子项目
文章图片

其中SubProjectSln的项目文件内容如下:
TEMPLATE = subdirsSUBDIRS += \ UiApp \ Dll \ Lib

这里最主要的就是这个项目文件
  • TEMPLATE不为subdirsSubProjectSln就不能创建子项目
  • SUBDIRS的项目顺序默认就是构建的顺序。
3. 三个项目内容 Dll依赖 LibUiApp依赖Dll
3.1 Dll Dll主要内容如下:
#include "dll.h" #include "../lib/lib.h"Dll::Dll() {}QString Dll::getDllName() { return "Dll"; }QString Dll::getLibName() { Lib lib; return lib.getName(); }

Dll项目文件如下:
#------------------------------------------------- # # Project created by QtCreator 2022-08-28T16:51:01 # #-------------------------------------------------QT-= guiTARGET = Dll TEMPLATE = libDEFINES += DLL_LIBRARYCONFIG(debug,debug|release){ DESTDIR = ../bin/debug LIBS += ../bin/debug/libLib.a } else { DESTDIR = ../bin/release LIBS += ../bin/release/libLib.a }SOURCES += dll.cppHEADERS += dll.h\ dll_global.hunix { target.path = /usr/lib INSTALLS += target }

3.2 Lib Lib主要内容如下:
#include "lib.h"Lib::Lib() { }QString Lib::getName() { return "Lib"; }

Lib项目文件内容如下:
#------------------------------------------------- # # Project created by QtCreator 2022-08-28T16:51:22 # #-------------------------------------------------QT-= guiTARGET = Lib TEMPLATE = lib CONFIG += staticlibCONFIG(debug,debug|release){ DESTDIR = ../bin/debug } else { DESTDIR = ../bin/release }SOURCES += lib.cppHEADERS += lib.h unix { target.path = /usr/lib INSTALLS += target }

3.3 UiApp UiApp界面如下:
QT|QtCreator按顺序编译多个子项目
文章图片

UiApp界面代码如下:
#include "widget.h" #include "ui_widget.h" #include "../Dll/dll.h"Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { Dll dll; ui->setupUi(this); ui->dllLabel->setText(dll.getDllName()); ui->libLabel->setText(dll.getLibName()); }Widget::~Widget() { delete ui; }

UiApp项目文件如下:
#------------------------------------------------- # # Project created by QtCreator 2022-08-28T16:50:24 # #-------------------------------------------------QT+= core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = UiApp TEMPLATE = appCONFIG(debug,debug|release){ DESTDIR = ../bin/debug LIBS += ../bin/debug/Dll.dll } else { DESTDIR = ../bin/release LIBS += ../bin/release/Dll.dll }SOURCES += main.cpp\ widget.cppHEADERS+= widget.hFORMS+= widget.ui

4. 构建 以如下顺序构建:
QT|QtCreator按顺序编译多个子项目
文章图片

这里的错误就是因为UiApp依赖了Dll,所以构建的顺序颠倒了。
修改SubProjectSln项目文件如下:
TEMPLATE = subdirsSUBDIRS += \ Lib \ Dll \ UiApp

即可构建成功。
我网上查资料有的说要在SubProjectSln项目文件中加CONFIG += ordered,使SUBDIRS按照顺序构建,但是我测试下来不加CONFIG += ordered,也是按照顺序构建的,猜测可能是版本的原因~~~
【QT|QtCreator按顺序编译多个子项目】运行结果如下:
QT|QtCreator按顺序编译多个子项目
文章图片

    推荐阅读