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 的移植, 實際上有些代碼必需要重寫,不能簡單一蹴而就.
?
總結
以上是生活随笔為你收集整理的linux qt程序向windows移植失败记.的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 真正能成功的人,不见得是最聪明的,也小见
- 下一篇: Linux 从头学 01:CPU 是如何