已经好多年了, 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};
其他的问题有时间继续补充。