QT4升级QT5调研报告

  • 平台差异

拟使用windows7平台,linux平台依赖的系统文件及对应链接库,须在windows平台找到对应库,或者替代库。

(1)如sys/types.h ,sys/ioctl.h ,net/if.h 等,因为平台差异所以在代码中会尽量避免使用,或寻找替代。

(2)util文件夹下的thread_safe_queue.h,timer.h,unique_queue.h无用,可删。

(3)包含路径不同,如linux下的home路径,在windows中会很少使用,应尽量使用相对路径。

  • QT版本差异

拟使用Qt5.11.1,QtCreator4.6.1,VS2017_64bit(MSVC14.1)。

  1. QT5模块划分和QT4有所不同,需要调整头文件包含,比如QWidget模块已经从QtGUI模块剥离。

需要修改一下 *.pro 为如下:
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

  1. 有些模块已经不存在:

QWSServer:Qt4的程序在嵌入式Linux运行时,需要加入参数“-qws”启动Qt窗口系统服务,如“./app -qws”运行app程序。从Qt5.0开始,Qt自身不再单独实现窗口系统,QWS不复存在,取而代之的新机制是QPA(Qt平台抽象),QPA使得Qt对不同平台的支持变得更加灵活,当需要支持一个新平台时,只需为该平台编写一个QPA插件。

目前关注这些,实际情况可能会遇到更多问题。

 

  • 三方库
  1. Boost 1_50_0
  2. Glog 0.3.5
  3. Qscintilla_gpl_2_10_8
  4. Sqlitecipher(OpenSSL 1.0.2 windows)_windows_master

版本信息根据实际情况调整。

四、重点功能

4.1网络通讯

目前QNetWorkProxy模块是基于st_asio_wrapper开发的,而st_asio_wrapper是一个c/s网络编程框架,基于对boost.asio的包装,目的是快速的构建一个c/s系统;从boost.asio继承而来,只支持tcp和udp协议。移植难点如下:

(1)Boost本身是跨平台,所以可以移植到windows,需重新编译相关库并测试;

(2)模块中依赖的sys/types.h ,net/if.h ,sys/ioctl.h 等linux系统文件需要考察替代文件和相应库,否则只能自己实现,或者通过qt实现:

①ifreq结构定义在/usr/include/net/if.h,用来配置ip地址,激活接口,配置MTU等接口信息的。其中包含了一个接口的名字和具体内容(是个共用体,有可能是IP地址,广播地址,子网掩码,MAC号,MTU或其他内容)。ifreq包含在ifconf结构中。而 ifconf结构通常是用来保存所有接口的信息的。

替代:ifreq可以用NCB代替,需包含windows.h,并在使用处更改结构内容。

②int ioctl(int fd, unsigned long cmd, void *data)方法在sys/ioctl.h中。第一个参数是文件描述符,第二个参数代表传递的命令,它会原样传递给驱动,第三个参数是可选类型的,主要根据第二个参数选择,第三个参数无论是整数还是指针,都会以unsigned long的形式传递给驱动程序。

替代:暂未找到。

综上,通过替换系统依赖的方法解决并不简单,且改动量较大,而QT自带QNetWorkProxy类能够更方便的实现网络通讯,且完全支持跨平台,便于以后的跨平台代码管理,研究后决定使用QT自带QNetWorkProxy类重新实现网络通讯模块。

4.2 NFS挂载

NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

  1. windows使用NFS功能需要手动安装NFS服务,安装过程可参考https://jingyan.baidu.com/article/0a52e3f4dc3f4abf63ed7259.html,但是windows10家庭版无法安装,所以尽量使用windows7。
  2. 目前使用的FILE *vpopen(const char* cmdstring, const char *type, int timeout_ms)函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行挂载命令。需要找到在windows中的替代。

替代:windows中的_DCRTIMP FILE* __cdecl _popen( _In_z_ char const* _Command,_In_z_ char const* _Mode )函数可实现相同功能。需要包含stdio.h,stdlib.h两个头文件。

发布了34 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Sparrow_du/article/details/86623593