linux qt程序向windows移植失败记.


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 的移植, 实际上有些代码必需要重写,不能简单一蹴而就.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值