1、代码目录结构
1.1、主要的文件结构如下:
_
│
│ 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子目录项目,内容如下:
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += \
src
- TEMPLATE 标识项目的模板类型如子目录项目、application程序、lib库项目,这里表示为子目录项目;详细解释:https://doc.qt.io/qt-5/qmake-variable-reference.html#template
- CONFIG += ordered 标识编译时按顺序处理,主要处理子项目之间有依赖关系
- SUBDIRS 标识下级的子目录项目,建议文件夹和pro文件名字相同,详细文档:https://doc.qt.io/qt-5/qmake-variable-reference.html#subdirs
2.2、MonkeyMDK.pri 文件
该文件定义项目常用的变量,如输出路径、库路径等,是项目公共的,可以在其他子目录项目进行包含使用,内容如下:
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 文件如下:
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += \
libs \
plugins \
app \
包含库libs、插件plugins、主程序app项目。
- libs.pri 中定义了库输出等路径:
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 中定义插件生成的路径:
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文件如下:
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文件内容如下:
TEMPLATE = subdirs
CONFIG += ordered
SUBDIRS += \
utils \
extensionsystem
- extensionsystem 子项目就是要用到的插件框架项目,包含了插件接口、插件管理、加载等功能;
- utils 子项目则存放常用的工具,如算法、json、字符串处理等;
2.6、插件plugins子目录项目
这个子目录项目存放核心插件 coreplugin和用户添加的其他各种插件,这样和app一起组成插件形式的程序,pro文件如下:
TEMPLATE = subdirsSUBDIRS += \ coreplugin
- coreplugin 就是核心插件项目,一般的主界面开始加载就在这里调用。
网友评论