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移植失败记.的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 真正能成功的人,不见得是最聪明的,也小见
 - 下一篇: Git的安装(附安装包)