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

news/2024/10/17 14:30:37/

前言

项目开发中,如果项目比较大,大多采用多项目的方式,主要是为了方便代码管理,也更开发变得更加方便。操作如下:
注:我用的版本是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 += orderedSUBDIRS += \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文件里面

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

结果


http://www.ppmy.cn/news/47271.html

相关文章

Java之~ Aop自定义注解日志

大纲步骤&#xff1a; 一&#xff0c;创建需要记录的日志表&#xff0c;创建基础方法。&#xff08;省略&#xff09; 二&#xff0c;在需要加记录日志的方法上加Aop注解1&#xff0c;创建一个注解类&#xff0c;Aop中定义一个注解import java.lang.annotation.*; /*** http 请…

Spring IoC注解开发

Component 组件 Controller 控制器 Service 业务 Repository 仓库 这四个标签是为了创建对象 其实他们四个本质都一样&#xff0c;只不过另外三个是Component的别名&#xff0c;在不同层使用容易区分 首先需要加入aop依赖&#xff0c;如果你事先加入spring-context依赖…

JS数组去重的12种方法

一、利用ES6 Set去重&#xff08;ES6中最常用&#xff09; Set对象是ES6中新定义的数据结构&#xff0c;类似数组&#xff0c;它允许存储任何类型的唯一值&#xff0c;不管是原始值还是对象引用。 Array.from()方法就是将一个类数组对象或者可遍历对象转换成一个真正的数组 …

【计算机视觉·OpenCV】使用Haar+Cascade实现人脸检测

前言 人脸检测的目标是找出图像中所有的人脸对应的位置&#xff0c;算法的输出是人脸的外接矩形在图像中的坐标。使用 haar 特征和 cascade 检测器进行人脸检测是一种传统的方式&#xff0c;下面将给出利用 OpenCV 中的 haarcascade 进行人脸检测的代码。 程序流程 代码 impo…

JeecgBoot 3.5.1 版本发布,开源的企业级低代码平台

项目介绍 JeecgBoot是一款企业级的低代码平台&#xff01;前后端分离架构 SpringBoot2.x&#xff0c;SpringCloud&#xff0c;Ant Design&Vue3&#xff0c;Mybatis-plus&#xff0c;Shiro&#xff0c;JWT 支持微服务。强大的代码生成器让前后端代码一键生成! JeecgBoot引领…

Vector - CAPL - Panel面板_01

前面有过简单的介绍panel面板的功能&#xff0c;不过终究感觉有点简陋&#xff0c;最近也在搞PyQT5&#xff0c;发现如果对于这块了解不多的情况下&#xff0c;想要做一些东西的话&#xff0c;简直无从下手&#xff0c;因此专门翻阅了之前的文章&#xff0c;查看了下确实缺少了…

使用wait监听tomcat服务启动

文章的wait脚本素材会放在末尾 执行docker-compose.yml文件之后就有mysql的主服务器&#xff0c;还有从服务器&#xff0c;还有tomcat服务&#xff0c;在tomcat中部署一个crm项目&#xff0c;tomcat服务中我们添加了启动顺序&#xff0c; # 启动顺序 depends_on: - mysql…

XO08R2 1SBP260109R1001接地系统能够为dcs提供屏蔽层,消除电子噪声干扰

​ XO08R2 1SBP260109R1001接地系统能够为dcs提供屏蔽层&#xff0c;消除电子噪声干扰 dcs合理、可靠的系统接地&#xff0c;是dcs系统非常重要的内容。为了保证dcs系统的监测控制精度和安全、可靠运行&#xff0c;必须对系统接地方式、接地要求、信号屏蔽、接地线截面选择、接…