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

QT+winodow 代码适配调试总结(二)

已经好多年了, linux环境下不同版本的QT程序开发和部署,突然需要适配window环境程序调试,一堆大坑,还真是一个艰巨的任务,可是kpi下的任务计划,开始吧!!

1、首先我们自定义的动态库,大多数不规范,所谓跨平台,只能说是QT本身的框架,实际自定义的动态库极其不规范, 大多数的动态库没有实现功能独立的功能,数据重定义和相互依赖是很头疼的事情,趁此机会斩断互相的网,逐步完成动态库的window适配,根据window环境的要求实现;

简单梳理一下过程:

A:自定义动态库中的总会有一个全局的文件,定义库导入和导出的宏

#ifdef AMS_SERVERDLL_EXPORTS
        #define MODBUSTCP_AMS_SERVERDLL_API Q_DECL_EXPORT
#else
        #define MODBUSTCP_AMS_SERVERDLL_API Q_DECL_IMPORT
#endif

B: 重点注意pro文件中需要包含:

DEFINES += AMS_SERVERDLL_EXPORTS

C: 对于暴露给外部调用的类,需要增加MODBUSTCP_AMS_SERVERDLL_API的约束,否则主程序调用会提一堆:LNK2019: 无法解析的外部符号 

2、其次:linux环境移动过来的动态库编码格式不统一,网上很多高招,尝试一遍不是很理想,尽管各种位置的设置UTF-8 , 代码中中文字符和中文注释成了调试的大问题,莫名其妙的问题,总结一下终极的方案: 下载安装Notepad++ 工具,针对莫名其妙问题的代码进行格式转换,转为UTF-8 BOM格式保存,问题就会解决成千上万;

最简便的方法: 在window环境下打开QTcreator ,代码编辑页面,鼠标右键,在最底部选择Add ut-f8 BOM on save 即可。

仍旧不起作用的可以在有问题的cpp和h文件顶部增加:

#pragma warning(disable:4068)
#pragma execution_character_set("utf-8") 
我自己亲自验证时起作用的。

如果还是不行,最坏的情况就是头文件和cpp文件中文注释全部删除,并且在代码语句带有中文信息的部分末尾处敲击空格:

QString("锅炉在线状态监测系统") 或者tr("锅炉在线状态监测系统") 调整为

 QString("锅炉在线状态监测系统  ") 或者tr("锅炉在线状态监测系统  ") 调整为

或者例如处理:

QString("锅炉在线状态监测系统") 或者tr("锅炉在线状态监测系统")  调整为QString::fromLocal8Bit("锅炉在线状态监测系统"); 

3 另外程序运行之后弹窗和打印的日志为乱码,问题不是很严重,也很容易解决,方案如下:

在项目文件pro文件中增加下面语句:

win32:msvc{    QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8
}

4 对于调用mysql驱动的问题,linux环境需要安装mysql的客户端,window环境下不需要安装,但是需要可执行程序的位置拷贝libmysql.dll 驱动文件。

5、linux环境下 数据初始化可以使用变量初始化,但window环境下不允许

例如:

int iDataCnt = 100;

int iParam[iDataCnt ];

这种linux环境下可以,但window环境不可以,window环境下不能使用变量,可以使用宏定义

int iParam[100]; 或者

#define  DATA_CNT  100

int iParam[DATA_CNT];

6、由于调用第三方库,类似数学函数和宏定义M_PI  window 无法识别,需要再pro 增加

DEFINES += _USE_MATH_DEFINES

7、其他入结构体对象和qvector赋初值,不允许直接通过 {}的方式,需要通过对象的单独赋值

例如:

Act act;

act.act = false;

act.row = 12;

act.col = 34;

不允许

Act act{false, 12, 34};

其他的问题有时间继续补充。

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

相关文章:

  • 百家讲坛 | 裴伟伟:企业中安全团队应当如何反馈漏洞
  • 巧用Fiddler中的Comments提升接口测试效率
  • 停车场车牌识别计费系统,用Python如何实现?
  • Linux内核——Linux内核体系模式(二)
  • Spring MVC的高级功能——异常处理(一)简单异常处理器
  • 【面试干货】Static关键字的用法详解
  • 软件工程实验
  • 对于复杂的网页布局,如多列布局和网格布局,CSS 有哪些最佳实践和技巧?
  • Spring Boot中集成Redis实现缓存功能
  • arco disign vue 日期组件的样式穿透
  • 【深度学习】pytorch训练中的一个大坑
  • python全局解释器锁(GIL)
  • 无人机的起源
  • 专题六:Spring源码之初始化容器BeanFactory
  • 缓存双写一致性(笔记)
  • 运动馆预约管理系统设计
  • 第五届计算机、大数据与人工智能国际会议(ICCBD+AI 2024)
  • 高效的向量搜索算法——分层可导航小世界图(HNSW)
  • 【MySQL备份】Percona XtraBackup全量备份实战篇
  • 港口危险货物安全管理人员考试题库(含答案)
  • 什么是 JVM( Java 虚拟机),它在 Java 程序执行中扮演什么角色?
  • Python容器 之 列表--下标和切片
  • Docker 运行Nacos无法访问地址解决方法
  • Stable Diffusion 商业变现与绘画大模型多场景实战
  • [CocosCreator]CocosCreator网络通信:https + websocket + protobuf
  • 并发控制-事务的调度、数据不一致问题(更新丢失、脏读、不可重复读)、非串行调度的的可串行化
  • Golang | Leetcode Golang题解之第202题快乐数
  • 算法:哈希表
  • 自然语言处理基本知识(1)
  • Java中的数据加密与安全传输