Qt 项目A调用项目B方法(项目架构管理)

前言

项目开发中,如果项目比较大,大多采用多项目的方式,主要是为了方便代码管理,也更开发变得更加方便。操作如下:
注:我用的版本是Qt 5.12.3

一、建立项目目录

要求:
1、项目A为主,项目B为辅;
2、定位:A为主要实现业务上界面交互,B为A提供方法支持,相当于将B作为一个可实时编辑的库

1、文件 -> 新建文件或项目 -> 其他项目 -> 子目录项目
注:项目名:TotalProject

新建项目

2、打开刚才项目的 .pro 文件,并编辑
TEMPLATM = subdirs

别忘加上面这句代码了

3、鼠标放置在项目名上,右键 新建子项目

子项目1

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:
Library
图2:
QtCore

2、此时得到了一个 Item2_global.h 文件

如图:
global

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 中

效果如图:
添加global之后

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文件里面

上述两个问题解决之后,基本上就可以运行成功了。

结果

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值