1、代码目录结构

1.1、主要的文件结构如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
_  

│ MonkeyQDK.pri
│ MonkeyQDK.pro
├───build
│ ├───bin
│ │ │ extensionsystem.dll
│ │ │ MonkayQDK.exe
│ │ │ utils.dll
│ │ │
│ │ └───plugins
│ │ coreplugin.dll
│ │
│ └───libs
│ coreplugin.dll
│ extensionsystem.dll
│ libcoreplugin.a
│ libextensionsystem.a
│ libutils.a
│ utils.dll

└───src
│ libs.pri
│ plugins.pri
│ src.pro

├───app
│ app.pro
│ main.cpp

├───libs
│ │ libs.pro
│ │
│ ├───extensionsystem
│ │ extensionsystem.pro
│ │
│ └───utils

└───plugins
│ plugins.pro

└───coreplugin
coreplugin.pro
  • MonkeyQDK.pro 文件是项目主文件
  • MonkeyQDK.pri 文件是辅助定义输出目录、库路径等变量
1.2、build目录

build 目录存放编译生成的库、插件和执行程序,包含bin文件夹和libs文件夹:

  • bin 文件存放可执行程序和它执行时要用到的库及插件的dll动态链接库文件,用于最后的打包
  • libs 文件存放插件和库所生成的静态链接库 .a 文件,用于程序编译
1.3 src代码文件目录

src 目录存放代码,包含app、libs、plugins文件夹:

  • app 为主函数main.cpp的子目录项目
  • libs 为插件框架和常用工具的子目录项目
  • plugins 存放各种插件子项目

2、项目和子项目

2.1、 主项目MonkeyQDK.pro

该文件描述下级src子目录项目,内容如下:

1
2
3
4
5
6
TEMPLATE = subdirs

CONFIG += ordered

SUBDIRS += \
src
2.2、MonkeyMDK.pri 文件

该文件定义项目常用的变量,如输出路径、库路径等,是项目公共的,可以在其他子目录项目进行包含使用,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
CONFIG += c++14

# app.exe and lib dll path
APP_OUT_PATH = $ $PWD/build/bin

# lib*.a path
APP_LIBS_PATH = $ $PWD/build/libs

# plugin dll path
APP_PLUGIN_PATH = $ $PWD/build/bin/plugins

#lib include
INCLUDEPATH += $ $PWD/src/libs
DEPENDPATH += $ $PWD/src/libs

上面变量定义了程序 .exe 及它要用的动态链接库 .dll 文件路径、编译时候的静态库 .a 文件路径、插件 .dll 文件路径路径;这里的 $PWD 表示 pro 或 pri 文件所在目录,这里即 MonkeyMDK.pri 文件所在的当前目录;

  • INCLUDEPATH 定义了编译要用的头文件目录
  • DEPENDPATH 用于添加qmake文件依赖
2.3、src 子目录项目

这里存放的代码源文件的项目,src.pro 文件如下:

1
2
3
4
5
6
7
8
TEMPLATE = subdirs

CONFIG += ordered

SUBDIRS += \
libs \
plugins \
app \

包含库libs、插件plugins、主程序app项目。

  • libs.pri 中定义了库输出等路径:
1
2
3
4
5
6
7
8
9
include(../MonkeyQDK.pri)

TEMPLATE = lib

DLLDESTDIR = $ $APP_OUT_PATH

DESTDIR = $ $APP_LIBS_PATH

LIBS += -L$ $DESTDIR

include 包含了之前定义的pri文件,因为要用到输出路径的变量;其中 DLLDESTDIR 定义要把库 dll 文件拷贝的路径,DESTDIR 则指示库生成的 .a 和 .dll 文件输出路径,LIBS 标识项目要链接的库路径。

  • plugins.pri 中定义插件生成的路径:
1
2
3
4
5
6
7
8
9
include(../MonkeyQDK.pri)

TEMPLATE = lib

DLLDESTDIR = $ $APP_OUT_PATH/plugins

DESTDIR = $ $APP_LIBS_PATH

LIBS += -L$ $DESTDIR

DLLDESTDIR 标识插件的目录,这里标识最后生成时把插件放置到exe所在目录的plugins文件夹下。

2.4、主程序 app子项目

这个子项目为主程序main的项目,项目pro文件如下:

1
2
3
4
5
6
7
8
9
10
11
12
include(../../MonkeyQDK.pri)

QT += core gui widgets

TEMPLATE = app

TARGET = MonkayQDK

SOURCES += \
main.cpp

DESTDIR = $ $APP_OUT_PATH
  • QT += 标识要用到的 Qt 库;
  • TARGET 定义生成的名字,这里即为 exe 文件名;
  • SOURCES 为源文件;
  • DESTDIR 指定输出目录,这里为 exe 路径,$ $APP_OUT_PATH引用了 pri 文件中定义的路径变量
2.5、库libs子目录项目

这个子项目放置要用的库项目,如核心的插件框架库extensionsystem、常用工具库utils等,pro文件内容如下:

1
2
3
4
5
6
7
TEMPLATE = subdirs

CONFIG += ordered

SUBDIRS += \
utils \
extensionsystem
  • extensionsystem 子项目就是要用到的插件框架项目,包含了插件接口、插件管理、加载等功能;
  • utils 子项目则存放常用的工具,如算法、json、字符串处理等;
2.6、插件plugins子目录项目

这个子目录项目存放核心插件 coreplugin和用户添加的其他各种插件,这样和app一起组成插件形式的程序,pro文件如下:

1
2
3
4
TEMPLATE = subdirs

SUBDIRS += \
coreplugin
  • coreplugin 就是核心插件项目,一般的主界面开始加载就在这里调用。