qt5.9.7 移植到qnx 7.0
網上有一篇針對qt 4的 針對的是qnx6.6,很多配置引數也對應不上,總結一下我移植qt 5.9.7 到qnx7.0的過程
首先我的系統是Ubuntu 16.04.02 + qnx 7.0 + qt 5.9.7
1.準備工作:
1.1 ubuntu 系統自行下載安裝, qnx7.0 自行配置安裝;
1.2 qt 5.9.7 原始碼包下載:
http://download.qt.io/archive/qt/5.9/5.9.7/single/
選擇qt-everywhere-opensource-src-5.9.7.tar.xz
下載 原始碼解壓到你的某個目錄下面如 ~/Download/qt/qt-everywhere-opensource-src-5.9.7
1.3 配置 qnx 環境變數:
如果你是bash環境,直接執行 source ~/qnx700/qnxdsp-env.sh
然後執行echo $PATH 檢視 qnx環境變數是否設定成功
如果 你像我用的zsh 環境,可以切換成bash 執行上面命令,我的做法是 vim ~/.zshrc 在最下面新增如下幾行
export QNX_HOST=/home/panda/qnx700/host/linux/x86_64
export QNX_TARGET=/home/panda/qnx700/target/qnx7
export MAKEFLAGS=-I/home/panda/qnx700/target/qnx7/usr/include
export QNX_CONFIGURATION=/home/panda/.qnx
export PATH=$PATH:/home/panda/qnx700/host/linux/x86_64/usr/bin:/home/panda/.qnx/bin:/home/panda/jre/bin
注意: 其中的路徑需要改為自己系統的安裝路徑
然後source ~/.zshrc
echo $QNX_TARGET 檢視qnx 環境變數是否設定成功
2. 編譯 qt
2.1 首先進到qt 原始碼目錄下配置 編譯選項 也可以新建個autoconfig.sh指令碼執行配置.
cd ~/Download/qt/qt-everywhere-opensource-src-5.9.7/
./configure -opensource -confirm-license -shared -release -xplatform qnx-armle-v7-qcc -no-rpath -reduce-exports -system-sqlite -continue -no-openssl -nomake examples -nomake tests -force-debug-info -separate-debug-info -prefix /opt/qt5.9.7
引數解釋 :
-opensource 建立開源版本的qt
-confirm-license自動確認許可
-release 發行版本
-shared 建立並連結QT共享庫
-xplatform 選擇交叉編譯目標板mkspec
-no-rpath 較難理解 不使用庫安裝路徑作為一個執行時庫路徑
-reduce-exports 減少資訊列印
-system-sqlite
-no-openssl SSL,Security Socket Layer,是一個安全傳輸協議,在Internet網上進行資料保護和身份確認,而OpenSSL是一個開放原始碼的實現了SSL及相關加密技術的軟體包,在qt中,我們可以選擇直接支援,或者OpenSSL連結支援,這個引數也是為有需要者提供的。
-nomake 選擇不編譯某些模組
-continue 發生錯誤,編譯繼續,最後處理錯誤
-force-debug-info 即使在除錯版本中也進行優化
-separate-debug-info 將除錯資訊到一個單獨的檔案
-prefix 預設安裝路徑
sudo make install #make install 的時候出現問題,問題解決請參考文後
make -j4 //大約編譯了1個小時(thinkpadT470)
注意:qnx-armle-v7-qcc 是針對arm32位系統,由於專案需要,我特別編譯了aarchle64 和x86-64 位系統的 編譯成功
2.2 configure 配置完成
3. 將生成的庫拷貝到目標qnx 系統中
目標板中usr下新建qt5目錄 將生成的libs plugins和 qml 三個資料夾拷貝過來,為了避免軟連結問題,可以壓縮拷貝再解壓.
目標板設定qt的環境變數,可以寫到/etc/profile中,也可以自己寫個指令碼,執行應用程式的時候再載入;在profile 中新增如下
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/qt5/lib
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/qt5/plugins
export QT_PLUGIN_PATH=/usr/qt5/plugins
export QML2_IMPORT_PATH=/usr/qt5/qml
4. 在本機上新建一個qt-qnx 工程, 將生成的exe 拷貝到目標板,執行,會提示需要什麼庫,然後從交叉編譯的工具庫中拷貝過去.
具體的本機如何配置新編譯的qt-for-qnx 工具鏈在下一篇部落格中詳細介紹.同時介紹如何在目標板正確執行qt 程式以及中文的支援等.
錯誤備註:
sudo make install。由於安裝到系統目錄/opt/qt5.9.7,所以加了sudo執行。就這步,出現了問題:
make[1]: ntoarmv7-ranlib: Command not found
檢索發現ntoarmv7-ranlib可以在系統的qnx PATH中找到,因為我已經把qnx 環境變數新增到了PATH中。
那為什麼還提示說找不到ntoarmv7-ranlib呢?
原因如下:
1.我新增arm交叉編譯器目錄到PATH中是放在~/.zshrc裡的,這是使用者的配置檔案,我的使用者為panda。
2.執行make install時,加了sudo字首,變成了root的工作環境和root的許可權。
根據以上兩點,make install是在root下做的,而ntoarmv7-ranlib在panda使用者的工作環境中才能找到。所以產生了這裡的錯誤。
那我既要取得root許可權,又要具有當前使用者yan的工作環境,怎辦呢?
解決如下:
執行make install之前,先用下sudo -i命令取得root許可權。然後再執行make install。
su 和 sudo 的區別:
1.共同點:都是root使用者的許可權;
2.不同點:su僅僅取得root許可權,工作環境不變,還是在切換之前使用者的工作環境;sudo是完全取得root的許可權和root的工作環境。
注意:sudo su切換到root時原使用者的環境變數也一併丟失。應使用sudo -i
索性就手動新增PATH環境變數
export PATH=$PATH:/home/panda/Downloads/arm/gcc-linaro-arm-linux-gnueabihf-4.9/bin/
export QNX_HOST=/home/panda/qnx700/host/linux/x86_64
export QNX_TARGET=/home/panda/qnx700/target/qnx7
export MAKEFLAGS=-I/home/panda/qnx700/target/qnx7/usr/include
export QNX_CONFIGURATION=/home/panda/.qnx
export PATH=$PATH:/home/panda/qnx700/host/linux/x86_64/usr/bin:/home/panda/.qnx/bin:/home/panda/jre/bin
然後make install,安裝成功
參考連結:
http://community.qnx.com/sf/discussion/do/listPosts/projects.qt/discussion.general.topc27009