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

Qt模块间依赖与解耦问题

1. 动态库与插件的依赖问题

  • 典型表现:插件调用主程序 / 动态库接口时提示 “未定义”。
  • 本质原因:编译 / 链接阶段的依赖缺失(头文件只声明未定义、符号未导出、库路径配置错误)。
  • 解决核心:将公共逻辑(如 JsonCommGlobal)抽离为独立动态库,让主程序和插件都以 “链接动态库” 的方式复用,而非直接依赖可执行文件。

2. 循环依赖问题

  • 典型表现:动态库需要调用主程序接口,同时主程序又依赖动态库,导致编译 / 运行时异常。
  • 本质原因:模块间双向依赖(动态库 ←→ 主程序),破坏了 “单向依赖” 的工程规范。
  • 解决核心:通过 ** 抽象接口(如 ICommProxy)** 做中间层,让动态库 “依赖接口而非实现”,主程序实现接口并注册给动态库,彻底切断双向依赖。

3. 共享数据结构的依赖问题

  • 典型表现:动态库和主程序都需要 PluginMetaData 等数据结构,直接引用主程序头文件导致依赖耦合。
  • 本质原因:数据结构与业务逻辑(如插件接口)强绑定,未做 “纯数据抽离”。
  • 解决核心:将共享数据结构(如 PluginMetaData)单独放在 “无业务依赖” 的公共头文件(如 CommonStruct.h)中,让动态库和主程序都只依赖这个纯数据文件。
  编写程序遇到的问题举例:    

问题1:动态库与插件的依赖问题某一插件想要调用主程序模块中JsonCommGlobal的接口JsonCommGlobal::sendPluginMessage提示 “未定义”

解决方法:核心原因是插件编译时无法找到 JsonCommGlobal 的符号定义,具体可能有以下几点:

  1. 头文件仅声明未定义:插件只包含了 JsonCommGlobal 的头文件(声明),但未链接包含其实现的动态库,导致链接阶段找不到符号。
  2. 符号未导出JsonCommGlobal 作为主程序动态库中的类,未使用 Q_DECL_EXPORT 导出符号,插件无法识别。
  3. 库路径配置错误:插件项目未正确配置主程序动态库的路径(LIBS),链接器无法找到库文件。

       针对第三点解释,JsonCommGlobal所在的主程序生成的是可执行文件(.exe),所以某一插件想要链接其实现的动态库需要将JsonCommGlobal拆分成一个独立的动态库(共享库),作为主程序和其他插件的 “公共依赖”。

步骤1:在 Qt Creator 中新建项目,选择 “Library”→“C++ Library”,类型选择 “Shared                           Library”(动态库),命名为 JsonCommLib;

步骤2:将主程序中与 JsonCommGlobal 相关的文件(.h.cpp)复制到该动态库项目中。

步骤3:修改动态库的头文件(添加导出 / 导入宏):为了让动态库中的类能被主程序和插件访问,                需要用 Qt 的导出宏标记类(确保跨平台兼容性)

步骤4:配置动态库的项目文件(.pro):

QT       += core  # 根据需要添加其他模块(如network、gui)
TARGET = JsonCommLib  # 动态库名称
CONFIG += shared  # 生成动态库
DESTDIR = ../bin  # 动态库生成到bin目录

步骤5:需要访问JsonCommGlobal的插件或者主程序,其所在.pro文件也需链接该动态库:

LIBS += -L../bin -lJsonCommLib  # 动态库的输出目录和库名称

注意事项

  • 编译顺序:先编译 JsonCommLib 生成动态库,再编译主程序和插件(依赖动态库)。
  • 运行时依赖:确保 JsonCommLib.dll 与主程序 .exe、插件 .dll 在同一目录(或系统能找到的路径),否则会提示 “找不到动态库”。

问题2:动态库(JsonCommGlobal某一接口)需要访问主程序uart 接口,前面主程序依赖已经动态库但如果动态库再依赖主程序的话,会出现循环依赖导致编译 / 链接失败,或运行时加载异常

解决方法:由于 JsonCommGlobal(动态库)需要调用主程序的 UartSingle/CanSingle<

http://www.dtcms.com/a/496198.html

相关文章:

  • LoRA 微调大模型直观的理解
  • LeetCode 面试经典 150_栈_简化路径(53_71_C++_中等)(栈+stringstream)
  • 苏中建设集团官方网站微信seo什么意思
  • 网站死链检测工具wordpress 注册邀请码
  • 企业网站结构网站套用模板
  • 2025年--Lc196-712. 两个字符串的最小ASCII删除和(动态规划在字符串的应用)--Java版
  • 淄博有做网站的吗第一免费营销型网站
  • 怎样做模板网站免费网站提交入口
  • 网站建设是要考虑什么东西做网站有底薪吗
  • 买卖合同审查要点及指南
  • Mui框架做网站专项培训网站建设方案
  • Marin说PCB之POC电路layout设计仿真案例---16
  • M部分权限的撤销
  • 建立网站一般多少钱怎样用网站做app
  • 申威(sw_64)架构下如何安装java-1.8.0-swjdk的rpm包?​
  • 性能测试之性能调优详解
  • sql日志打印控制台及存储
  • 青岛城乡住房建设厅网站软件开发外包是什么意思
  • 网站公司的未来中国城乡住房和建设部网站
  • 算法416. 分割等和子集
  • 编织网站建设网站建设考核
  • 2-SpringCloud-Consul服务注册与发现和分布式配置管理
  • 前后端分离项目java+vue 加密一般用几种加密方式,具体是什么加密,怎么用的
  • 从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
  • matlab_学习_均分数据
  • 深圳免费建站山东省建设节能协会网站
  • 青岛万维网站设计珠宝类企业网站(手机端)
  • 【展厅多媒体】触摸查询一体机实现数据可视化
  • linux学习笔记(37)mysql视图详解
  • 自定义配置小程序tabbar逻辑思路