前言
项目开发中,如果项目比较大,大多采用多项目的方式,主要是为了方便代码管理,也更开发变得更加方便。操作如下:
注:我用的版本是Qt 5.12.3
一、建立项目目录
要求:
1、项目A为主,项目B为辅;
2、定位:A为主要实现业务上界面交互,B为A提供方法支持,相当于将B作为一个可实时编辑的库
1、文件 -> 新建文件或项目 -> 其他项目 -> 子目录项目
注:项目名:TotalProject
2、打开刚才项目的 .pro 文件,并编辑
TEMPLATM = subdirs
别忘加上面这句代码了
3、鼠标放置在项目名上,右键 新建子项目
4、如上图,选择Application -> Qt Widget Application -> Choose -> 继续填写信息直至完成
注:子项目1名字为 Item1
5、重复3和4的动作,新建了2个子项目,名字为Item1和Item2
现在项目结构如图:
6、此时两个子项目没有任何关系,后面要做的就是将项目关联起来
二、项目关联
1、新建 global.h 文件
文件 -> 新建文件或项目 -> Library -> C++库 -> 类型:共享库 -> Kit Selection -> 选择QtCore -> 类名 -> Next
注:为了减少更名的麻烦,所以这里我将类名直接设置为 Item2
如图1:
图2:
2、此时得到了一个 Item2_global.h 文件
如图:
3、编辑 global.h 文件 和 Item2.pro 文件
3.1 在 Item2.pro 文件中加入代码:
DEFINES += ITEM2_LIB
TEMPLATE = lib
注:名字根据自己项目来即可,方便管理和阅读;(命名建议:项目名_LIB)
3.2 在global.h 文件中修改代码:
原代码:
#ifndef ITEM2_GLOBAL_H
#define ITEM2_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(ITEM2_LIBRARY)
# define ITEM2SHARED_EXPORT Q_DECL_EXPORT
#else
# define ITEM2SHARED_EXPORT Q_DECL_IMPORT
#endif
#endif // ITEM2_GLOBAL_H
修改后
#ifndef ITEM2_GLOBAL_H
#define ITEM2_GLOBAL_H
#include <QtCore/qglobal.h>
#if defined(ITEM2_LIB)
# define ITEM2_EXPORT Q_DECL_EXPORT
#else
# define ITEM2_EXPORT Q_DECL_IMPORT
#endif
#endif // ITEM2_GLOBAL_H
4、将 global.h 文件拷贝到 Item2 项目目录下,并添加现有文件,将 global.h 加入项目 Item2 中
效果如图:
5、编辑 Item2 项目文件
注:文件有 Item2.h和 Item2.cpp
在 Item2.h 头文件中,加入代码 ITEM2_EXPORT
class ITEM2_EXPORT Item_two{
public:
Item_two();
int maxValue(const int, const int);
}
ITEM2_EXPORT 就是之前在 global.h 文件的,一定要对应
6、编辑 Item1.pro 文件
1、增加includePath 和 libs
INCLUDEPATH += $$PWD/../Item2
LIBS += D:/Code/build/Item2/debug/item2.lib
注:LIBS 我是直接在构建 Item2 之后,拿到的 item2.lib 的路径,这是绝对路径,建议用相对路径
相对路径:
CONFIG(debug, debug | release){
DESTDIR += $${PWD}/../Runs/debug #DESTDIR 目标程序生成目录
LIBS += $${PWD}/../Runs/debug/Item2.lib #libs 库生成目录
}else{
DESTDIR += $${PWD}/../Runs/release #DESTDIR 目标程序生成目录
LIBS += $${PWD}/../Runs/release/Item2.lib
}
7、编辑 TotalProject.pro 文件
CONFIG += ordered
SUBDIRS += \
Item2 \
Item1
三、验证
方式:item1 上去调用 item2 的方法 maxValue
1、cpp 实现 item_two.h 的 maxValue 方法
int Item_two::maxValue(const int a, const int b){
return a > b ? a : b;
}
2、在 Item_one.h 文件 include “Item_two.h”,并调用 maxValue 方法
Item_two v;
int value = v.maxValue(10, 15);
qDebug() << value;
3、构建 -> 运行
此时应该是报错的
错误1:无法解析外部符号,未找到文件 Item1.obj 或者 ***.obj
解决方法:文章第二节《项目关联》中第6小节,设置LIBS。(应该是LIB路径不对)
错误2:由于找不到Item2.dll,无法继续执行代码
解决方法:去项目build路径下,在Item2文件中的Item2.dll,将该文件复制到 Item1 文件夹中debug文件里面
上述两个问题解决之后,基本上就可以运行成功了。