当前位置: 首页 > news >正文

Qt中项目A调用另一个项目B的方法汇总

在开发一个软件项目时候,当涉及到一个模块,已经有过类似的项目开发,为了避免重复开发,涉及到在该项目的工程中调用已开发的项目作为子项目,有很多种方法。

一、将项目编译成库文件然后进行调用

调用库文件通常有两种调用方法,一种是内部调用,一种是外部调用。两者的区别不大,也就是

1.内部调用

用到TEMPLATESUBDIRS,只是这样就还需要一个大框架C来包含A和B,并不好用。

TEMPLATE = subdirs
SUBDIRS += \A \B 

2.外部调用

1) 方法1

项目A中调用项目B 的大致流程如下:

  1. 将项目B生成动态或者静态库,编译动态库可以参考撮合Qt的mingw编译器与snmp++3.4.6之源码编译动态库,编译静态库可以参考撮合Qt的mingw编译器与snmp++3.4.6之源码编译静态库;
  2. 将B的库文件和B所有的头文件一起放到项目A的工程目录下的同个目录中。(当然,也可以放到写入环境变量的目录下,只是个人感觉没必要);
  3. 通过外部库调用,引用库文件,使用"add Existing Directory"导入头文件。使用库文件的方法可以参考撮合Qt的mingw编译器与snmp++3.4.6之库文件使用。

1) 方法2

还有一种方法,可以用到Qt的宏定义,项目A中调用项目B 的大致流程如下:

  1. 在项目B的pro文件中修改,TEMPLATE = lib,意我编译为库文件;
  2. 在B的pro文件中添加,DEFINES += TEXT_LIBRARY,意为导出库文件,可参考Qt文档阅读笔记-共享库的创建与调用;
  3. 添加或者修改xxx_global.h文件,与第二步中的DEFINES内容对应起来,具体参考Qt文档阅读笔记-共享库的创建与调用;
  4. 修改B的类文件的内容,类名前加上第二步中DEFINES的内容,参考QT生成带界面的动态库并使用;

二、将项目编译成库文件然后进行调用

1.直接导入调用

项目A调用项目B,进行讲解。
直接将项目B的文件整个放入A中,然后通过"add Existing Directory",将B放入A中。只是这样的话,相当于将工程B的pro文件的内容,都写入A的pro文件中,这样A的工程文件会比较混乱,不利于使用。

2.使用pri文件调用

在项目B中创建一个pri文件,然后在A中调用B的pri文件,pri文件中的内容大致就是B的pro文件中的内容。这样使用起来会比较整齐。
例如B的pro文件的内容如下:

#-------------------------------------------------
#
# Project created by QtCreator 2019-01-22T17:29:55
#
#-------------------------------------------------QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = ADataAnsys
TEMPLATE = appSOURCES +=\widget.cpp \paintarea.cpp \globaldata.cpp \playthread.cpp \dataansys.cppHEADERS  += widget.h \paintarea.h \globaldata.h \playthread.h \dataansys.hFORMS    += widget.ui

则pri文件的内容可以这么写

SOURCES +=\$$PWD/widget.cpp \$$PWD/paintarea.cpp \$$PWD/globaldata.cpp \$$PWD/playthread.cpp \$$PWD/dataansys.cppHEADERS  += $$PWD/widget.h \$$PWD/paintarea.h \$$PWD/globaldata.h \$$PWD/playthread.h \$$PWD/dataansys.h \FORMS    += $$PWD/widget.ui

因为这两行内容

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgets

在A的pro文件中有写,因此可以不写。
这两行内容

TARGET = ADataAnsys
TEMPLATE = app

因为B和A一起编译,因此不能写。都使用A的内容。
pri文件启示是pro文件的补充。可参考

三、结论

将项目编译成库文件然后进行调用,这样也有弊端,在跨平台时可能会比较麻烦,需要重新编译新的库。因此,笔者更喜欢用第二种方法,直接将要被调用的项目生成一个pri文件,放入调用的工程文件中,一起编译。

http://www.lryc.cn/news/8116.html

相关文章:

  • 【项目精选】基于Javaee的影视创作论坛的设计与实现(视频+论文+源码)
  • 深入【虚拟列表】动态高度、缓冲、异步加载... Vue实现
  • Windows 11 + WSL(ubuntu 20.04) + CLion(2022.3) 编译OpenJDK12
  • Freemarker 语法精粹
  • 使用Benchto框架对Trino进行SQL性能对比测试
  • Redis之哨兵模式
  • Selenium自动化测试Python二:WebDriver基础
  • 蓝桥杯模块学习17——AT24C02存储器(深夜学习——单片机)
  • netty
  • Django项目部署-uWSGI
  • jhipster自动生成java代码的方法
  • LeetCode 82. 删除排序链表中的重复元素 II
  • tensorflow gpu环境安装
  • 如何在现实场景中随心放置AR虚拟对象?
  • 操作系统-处理机调度
  • 手机截图如何提取文字?
  • vue中复制内容
  • MySQL CAST()函数用法
  • 【测试工程师面试】详细记录 自己的一次面试
  • Elasticsearch 安装(二)
  • Java基础:异常与错误(ExceptionError)
  • VAmPI:一个包含了OWASP Top10漏洞的REST API安全学习平台
  • springboot(6)之前端传递参数的方式 普通 集合 数组
  • redis分布式锁的演变过程
  • leaflet 修改popup的样式,个性化弹窗(069)
  • 注解ConfigurationProperties、EnableConfigurationProperties的用法
  • 自适应布局之淘宝无限适配+rem+微信rpx自适应
  • esxi不能识别不兼容网卡解决方案
  • Sizeof与Strlen的区别与联系
  • 力扣(LeetCode)413. 等差数列划分(2023.02.15)