linux qt程序向windows移植失败记.
linux qt程序向windows移植失敗記.
這是一個(gè)復(fù)雜的程序, 有源碼,linux下可編譯,想移植到windows 下運(yùn)行
失敗原因不是因?yàn)槭莙t 程序,而是因?yàn)槭莑inux 程序,因?yàn)闋砍兜絨t,也著實(shí)廢了兩天功夫.所以記錄一下過(guò)程
------------------------------------------------------------
甲: windows 下qt 編譯程序的建立, 純window版qt程序環(huán)境
------------------------------------------------------------
?? ?qt 在linux 下安裝很簡(jiǎn)單,sudo apt-get 就行了. 在windows 下安裝
?? ?1. 下載安裝文件 , 我選擇的是vs2008 版本
?? ?qt-opensource-windows-x86-vs2008-4.8.6.exe (236M)
?? ?有qmake 及qt 頭文件和庫(kù)
?? ?2. 再下載編譯工具: 網(wǎng)上找了一個(gè)? , vs2008,跟qt安裝版本配套
?? ?vs2008expresswithsp1.zip (912M)
?? ?有nmake 及cl工具等
?? ?環(huán)境的建立需要花點(diǎn)時(shí)間從網(wǎng)上下載文件. 看你的下載工具和網(wǎng)速了. 最好選擇支持?jǐn)帱c(diǎn)續(xù)傳的工具.
?? ?這個(gè).zip 解開是個(gè).iso 文件.
?? ?又要安裝虛擬光驅(qū)軟件,我下載了 DTlite.exe 文件, 又關(guān)聯(lián)microsoft.net framework4.5 再下載!
?? ?上午就過(guò)去了,吃飯!
?? ? 由于編譯缺少太多l(xiāng)inux 頭文件, 所以除了能編除個(gè)hello world 運(yùn)行,基本上不能移植, 那么用mingw
?? ?環(huán)境怎么樣呢? 有l(wèi)inux? 頭文件, 用gcc 來(lái)編譯
------------------------------------------------------------
乙: mingw 環(huán)境的建立
------------------------------------------------------------
官網(wǎng)最新的x86_64文件
msys2-x86_64-20190524.exe
下載:
axel -n 10 -a http://repo.msys2.org/distrib/x86_64/msys2-x86_64-20190524.exe
安裝的sys2, 這是一個(gè)類unix 的命令行環(huán)境,而且還支持pacman 包管理
pacman -S?? ??? ?安裝包
pacman -Sy?? ??? ?同步包數(shù)據(jù)庫(kù)
pacman -Syy?? ??? ?強(qiáng)制同步包數(shù)據(jù)庫(kù)
pacman -Su?? ??? ?更新所有安裝包
我們用pacman 來(lái)安裝mingw環(huán)境和qt環(huán)境
用mingw 的gcc 來(lái)編譯, 確實(shí)很多文件可以編譯了,但也遇到了很多問(wèn)題
------------------------------------------------------------
丙: qt4 程序向qt5程序移植的問(wèn)題
------------------------------------------------------------
linux 下源程序代碼是qt4下的代碼,可是mingw的環(huán)境現(xiàn)在已經(jīng)更新到qt5,并且沒(méi)有qt4環(huán)境了
所以先把qt4的代碼編譯成qt4,qt5兼容代碼,這可以在linux 下首先完成
如果你的qmake 需要支持多個(gè)版本,可以如下選擇qmake
qmake 是qtchooser 的軟連接, 跟蹤qmake, 發(fā)現(xiàn)其調(diào)用
3494? open("/usr/lib/x86_64-linux-gnu/qtchooser//default.conf", O_RDONLY) = 4
修改該配置文件,可以修改默認(rèn)的版本
qt5 添加了QWidget 環(huán)境組,界面控件被挪到了QWidget目錄,并有其它少許變化
1.
QDialog: No such file or directory
#include <QDialog>
請(qǐng)?jiān)?pro文件中包含
QT += widgets
這將會(huì)在編譯選項(xiàng)上增加一項(xiàng) -DQT_WIDGETS_LIB
為了保證代碼既可以在qt4環(huán)境編譯,又可以在qt5編譯,應(yīng)該用一個(gè)宏來(lái)區(qū)分,查編譯差別,
qt5 有 -DQT_WIDGETS_LIB
qt4 沒(méi)有
所以可以用下面這個(gè)宏
#ifdef QT_WIDGETS_LIB
?? ?qt5 code
#else
?? ?qt4 code
#endif
2. 系統(tǒng)頭文件挪動(dòng)位置問(wèn)題
error: 'QProgressDialog' was not declared in this scope? ?
將#include <QtGui> 改為 #include <QtWidgets>
3. 某些功能已經(jīng)去除問(wèn)題,直接刪除代碼即可
?error: 'setCodecForCStrings' is not a member of 'QTextCodec' ?
?不需要了
上面的1,2,3項(xiàng)是因?yàn)閙ingw 現(xiàn)在只有qt5環(huán)境, 而linux 下源程序代碼是qt4下的代碼,
所以先改為用qt5也能編譯通過(guò)。可見qt4和qt5的代碼差別還是比較小的.
------------------------------------------------------------
丁: linux 向windows 移植問(wèn)題,有些代碼不可移植,只能重寫.
------------------------------------------------------------
比如網(wǎng)絡(luò)特性,posix 線程特性,這是windows和linux的鴻溝
4. 丟失系統(tǒng)頭文件問(wèn)題
fatal error sys/wait.h no such file or directory
fatal error sys/socket.h no such file or directory
比如mingw,無(wú)法編譯這些linux 頭文件的 netinet/in.h,arpa/inet.h,netinet/in.h,arpa/inet.h,<sys/ioctl.h>等等
cygwin 據(jù)說(shuō)比mingw 有更強(qiáng)的可移植性,不過(guò)也有cygwin不支持的Unix特性,比如pthread
鑒于此,放棄了僅靠重新編譯一下完成linux源代碼向windows 的移植, 實(shí)際上有些代碼必需要重寫,不能簡(jiǎn)單一蹴而就.
?
總結(jié)
以上是生活随笔為你收集整理的linux qt程序向windows移植失败记.的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 真正能成功的人,不见得是最聪明的,也小见
- 下一篇: Linux 从头学 01:CPU 是如何