linux qt程序向windows移植失败记.
这是一个复杂的程序, 有源码,linux下可编译,想移植到windows 下运行
失败原因不是因为是qt 程序,而是因为是linux 程序,因为牵扯到qt,也着实废了两天功夫.所以记录一下过程
------------------------------------------------------------
甲: windows 下qt 编译程序的建立, 纯window版qt程序环境
------------------------------------------------------------
qt 在linux 下安装很简单,sudo apt-get 就行了. 在windows 下安装
1. 下载安装文件 , 我选择的是vs2008 版本
qt-opensource-windows-x86-vs2008-4.8.6.exe (236M)
有qmake 及qt 头文件和库
2. 再下载编译工具: 网上找了一个 , vs2008,跟qt安装版本配套
vs2008expresswithsp1.zip (912M)
有nmake 及cl工具等
环境的建立需要花点时间从网上下载文件. 看你的下载工具和网速了. 最好选择支持断点续传的工具.
这个.zip 解开是个.iso 文件.
又要安装虚拟光驱软件,我下载了 DTlite.exe 文件, 又关联microsoft.net framework4.5 再下载!
上午就过去了,吃饭!
由于编译缺少太多linux 头文件, 所以除了能编除个hello world 运行,基本上不能移植, 那么用mingw
环境怎么样呢? 有linux 头文件, 用gcc 来编译
------------------------------------------------------------
乙: mingw 环境的建立
------------------------------------------------------------
官网最新的x86_64文件
msys2-x86_64-20190524.exe
下载:
axel -n 10 -a http://repo.msys2.org/distrib/x86_64/msys2-x86_64-20190524.exe
安装的sys2, 这是一个类unix 的命令行环境,而且还支持pacman 包管理
pacman -S 安装包
pacman -Sy 同步包数据库
pacman -Syy 强制同步包数据库
pacman -Su 更新所有安装包
我们用pacman 来安装mingw环境和qt环境
用mingw 的gcc 来编译, 确实很多文件可以编译了,但也遇到了很多问题
------------------------------------------------------------
丙: qt4 程序向qt5程序移植的问题
------------------------------------------------------------
linux 下源程序代码是qt4下的代码,可是mingw的环境现在已经更新到qt5,并且没有qt4环境了
所以先把qt4的代码编译成qt4,qt5兼容代码,这可以在linux 下首先完成
如果你的qmake 需要支持多个版本,可以如下选择qmake
qmake 是qtchooser 的软连接, 跟踪qmake, 发现其调用
3494 open("/usr/lib/x86_64-linux-gnu/qtchooser//default.conf", O_RDONLY) = 4
修改该配置文件,可以修改默认的版本
qt5 添加了QWidget 环境组,界面控件被挪到了QWidget目录,并有其它少许变化
1.
QDialog: No such file or directory
#include <QDialog>
请在.pro文件中包含
QT += widgets
这将会在编译选项上增加一项 -DQT_WIDGETS_LIB
为了保证代码既可以在qt4环境编译,又可以在qt5编译,应该用一个宏来区分,查编译差别,
qt5 有 -DQT_WIDGETS_LIB
qt4 没有
所以可以用下面这个宏
#ifdef QT_WIDGETS_LIB
qt5 code
#else
qt4 code
#endif
2. 系统头文件挪动位置问题
error: 'QProgressDialog' was not declared in this scope
将#include <QtGui> 改为 #include <QtWidgets>
3. 某些功能已经去除问题,直接删除代码即可
error: 'setCodecForCStrings' is not a member of 'QTextCodec'
不需要了
上面的1,2,3项是因为mingw 现在只有qt5环境, 而linux 下源程序代码是qt4下的代码,
所以先改为用qt5也能编译通过。可见qt4和qt5的代码差别还是比较小的.
------------------------------------------------------------
丁: linux 向windows 移植问题,有些代码不可移植,只能重写.
------------------------------------------------------------
比如网络特性,posix 线程特性,这是windows和linux的鸿沟
4. 丢失系统头文件问题
fatal error sys/wait.h no such file or directory
fatal error sys/socket.h no such file or directory
比如mingw,无法编译这些linux 头文件的 netinet/in.h,arpa/inet.h,netinet/in.h,arpa/inet.h,<sys/ioctl.h>等等
cygwin 据说比mingw 有更强的可移植性,不过也有cygwin不支持的Unix特性,比如pthread
鉴于此,放弃了仅靠重新编译一下完成linux源代码向windows 的移植, 实际上有些代码必需要重写,不能简单一蹴而就.