原創文章,轉發請注明鏈接和作者。(而且作者很懶,沒有檢查錯別字)
OpenWrt/LEDE中使用qt庫
下面將從零開始介紹在openwrt中使用qt的庫進行編程,本文默認讀者掌握了將openwrt系統刷如對應設備的技巧,並且有一台裝有linux系統的個人電腦。大致分為以下幾個步驟:
-
編譯openwrt並生成交叉工具鏈
-
在個人電腦中安裝qt creator
-
利用上述步驟生成的交叉工具鏈和qt源碼生成qt套件
-
編寫測試程序並且結局動態鏈接庫丟失的問題
發現這部分內容網上沒有現成的,但是其實每部分都能找到,綜合了一些教程,這也就稀里糊塗隨便寫了寫,本人文采不好,不懂的請留言,我會加以改進。
參考了:
https://www.cnblogs.com/kmist/p/9774292.html
https://blog.csdn.net/SharpQian/article/details/78614936
https://blog.csdn.net/thankfulheart/article/details/81141642
1編譯openwrt並生成交叉工具鏈
刷入的openwrt系統通常可以來自網上直接下載的鏡像,也可以來自自己編譯的,因為在自行編譯系統的過程中可以進行微調,修改相關的功能。無論讀者使用那種方式的openwrt系統,在這一步,我們都需要下載源碼並且進行編譯操作。
1.1源碼環境
參考
總之就是需要下面的庫,自己慢慢下載吧:
sudo apt-get install g++
sudo apt-get install libncurses5-dev
sudo apt-get install zlib1g-dev
sudo apt-get install bison
sudo apt-get install flex
sudo apt-get install unzip
sudo apt-get install autoconf
sudo apt-get install gawk
sudo apt-get install make
sudo apt-get install gettext
sudo apt-get install gcc
sudo apt-get install binutils
sudo apt-get install patch
sudo apt-get install bzip2
sudo apt-get install libz-dev
sudo apt-get install asciidoc
sudo apt-get install subversion
sudo apt-get install sphinxsearch
sudo apt-get install libtool
sudo apt-get install sphinx-common
sudo apt-get install libssl-dev
sudo apt-get install libssl0.9.8
sudo apt-get install git-core
sudo apt-get install build-essential
sudo apt-get install mercurial
1.2源碼下載
參考文章:https://blog.csdn.net/mojie_babyno1/article/details/81135039
源碼的下載地址其實可以自己去尋找,這里以18.01為例,分步驟執行以下內容:
git clone git://github.com/openwrt/openwrt.git
cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a
上述步驟的用途依次為:
-
下載源碼
-
進入源碼目錄
-
更新組件的源碼(openwrt設計到的或者可選的一些其他的庫文件,內核模塊或軟件)
-
安裝跟新下載好的組件源碼
1.3編譯系統與生成交叉工具鏈
這兩部可以一起做,反正都是要編譯一堆東西的。輸入以下命令,開始配置:
make menuconfig
-
修改路由器型號,這里注意:要先正確選擇好"Subtarget"菜單
-
勾選"Package the OpenWrt-based Toolchain"菜單(這一步使得可以生成交叉工具鏈)
-
[可選] Development--->Libraries--->zlib-dev(本人編譯好QT后缺少這個,沒辦法,后來手動補了,不選也可以后面解決,這里推薦選上)
-
[可選/不推薦] Development--->gcc(本人編譯好QT后缺少了gcc庫,后來手動補了,有些時候選上這個會導致無法編譯,不選也可以后面解決。)
-
退出菜單,並且保存
-
開始編譯,輸入:make V=s
1.4添加環境變量
編譯完成后,你的交叉工具鏈會出現在./staging_dir/toolchain-mips_24kc_gcc-7.3.0_musl/bin里面,先我們需要將交叉工具鏈添加到環境變量,這樣你就可以像使用gcc一樣簡單的使用生成的交叉工具鏈了。這里以ubuntu為例進行修改,別的操作系統修改的方法可以自行搜索
修改~/.profile文件,在最后一行添加:
export PATH=你的交叉工具鏈目錄:$PATH
例如:export PATH=$HOME/openwrt_project/openwrt/staging_dir/toolchain-mips_24kc_gcc-7.3.0_musl/bin:$PATH
完成並且保存文件后輸入:source ~/.profile,或者也可以直接重啟電腦。
完成之后試一下,能不能在其他目錄直接使用交叉工具鏈中的工具,例如我的測試了一下在其他目錄中輸入mips-openwrt-linux-gcc -v,結果正常。
2 安裝qt creator
在下面地址中掉選一個你喜歡的qt版本:http://download.qt.io/archive/qt/,下面以5.14.0進行說明
5.14.0:http://download.qt.io/archive/qt/5.14/5.14.0/。
右鍵qt-opensource-linux-x64-5.14.0.run。復制下載連接。
在終端中輸入:
cd ~
mkdir ./qt
cd ./qt
wget xxxxx(粘貼你剛剛復制的下載鏈接)
功能分別為:
-
進入自己的主目錄
-
創建qt文件夾
-
進入qt文件夾
-
下載qt-opensource-linux-x64-5.14.0.run
下載完成后輸入以下命令進行安裝:
chmod 777 ./qt-opensource-linux-x64-5.14.0.run
./ qt-opensource-linux-x64-5.14.0.run
這里開始就自己挑選組件安裝吧,記得要選上creator
參考內容:https://blog.csdn.net/hansion3333/article/details/60468590
3生成qt套件
裝好了creator,我們要開始編譯自己的套件了。
http://download.qt.io/archive/qt/5.14/5.14.0/single/里面下載qt-everywhere-src-5.14.0.tar.xz文件。下載方法和上面下載qt-opensource-linux-x64-5.14.0.run類似。
下載好了之后:tar -xvf ./qt-everywhere-src-5.14.0.tar.xz
下面分為兩種情況:
-
qt-everywhere-src-5.14/qtbase/mkspecs/ 中有你需要的現成配置,比如路由器為arm構架的,你可以在文件夾里面看到這個目錄:linux-arm-gnueabi-g++/
-
qt-everywhere-src-5.14/qtbase/mkspecs/ 中沒有你需要的現成配置,下面會以mips為例說明,其實就多了一步而已
3.1沒有現成配置文件的
其實有能力的讀者這里可以參考已有的配置文件進行修改,但是有一篇帖子寫得比較詳細,這里引用:
https://blog.csdn.net/thankfulheart/article/details/81141642
最原始的代碼里是沒有linux-mips-g++這個目錄的所以要自己添加
在qtbase/mkspecs下創建linux-mips-g++文件夾
然后添加文件qmake.conf和qplatformdef.h兩個文件
qmake.conf按照如下編寫(mipsel-openwrt-linux-是我的交叉編譯工具前綴,換成你自己的):
# qmake configuration for building with mipsel-openwrt-linux-g++
#
MAKEFILE_GENERATOR = UNIX
CONFIG += incremental gdb_dwarf_index
QMAKE_INCREMENTAL_STYLE = sublib
include(../common/linux.conf)
include(../common/gcc-base-unix.conf)
include(../common/g++-unix.conf)
# modifications to g++.conf
QMAKE_CC = mipsel-openwrt-linux-gcc
QMAKE_CXX = mipsel-openwrt-linux-g++
QMAKE_CFLAGS += -mips32
QMAKE_CXXFLAGS += -mips32
QMAKE_LINK = mipsel-openwrt-linux-g++
QMAKE_LINK_SHLIB = mipsel-openwrt-linux-g++
# modifications to linux.conf
QMAKE_AR = mipsel-openwrt-linux-ar cqs
QMAKE_OBJCOPY = mipsel-openwrt-linux-objcopy
QMAKE_STRIP = mipsel-openwrt-linux-strip
load(qt_config)
qplatformdef.h從qtbase/mkspecs/linux-arm-gnueabi-g++目錄下拷貝即可
下面得步驟和有現成配置文件得情況相同。
3.2有現成配置的
輸入:
cd qt-everywhere-src-5.14
./configure -release -xplatform xxxx(這里的xxxx換成自己的配置) -confirm-license -opensource -shared -no-qml-debug -no-opengl -no-audio-backend -no-openssl -no-sql-sqlite -no-libjpeg -no-libpng -no-gif -no-journald -no-mtdev -no-freetype -no-harfbuzz -no-glib -no-gtkstyle -no-gui -no-widgets -no-iconv -no-tslib -no-linuxfb -no-dbus -qt-zlib -nomake examples
make
make install
上述命令功能依次為:
-
進入源碼目錄
-
修改編譯配置,這里需要注意的是,最重要的是"./configure -release -xplatform xxxx",其他的內容,根據自己的需求修改,可以通過./configure –help查看每一項是什么意思。
-
編譯
-
安裝,默認安裝到:/usr/local/Qtxxxxx
3.3添加套件到qt creator
-
打開qt creator,在 tool->option 里面選擇添加自己剛剛編譯好得qt
-
添加自己生成得交叉工具鏈
-
設置一個套件
4測試
建立qt的工程,自行編譯這里沒啥好說的,qt基本操作,推薦使用靜態連接,也就是在.pro文件的CONFIG中加入static
4.1缺庫問題
即使使用靜態連接,生成的軟件依然可能會缺少openwrt自己的庫,這個時候需要自己補全,下面給出自己補全庫的例子:
4.2缺少libz.so.1
進入openwrt源碼目錄
make menuconfig
Development ---> Libraries ---> zlib-dev勾選
退出並保存
make ./package/libs/zlib/compile v=s
完成后:openwrt/staging_dir/target-mips_24kc_musl/root-ar71xx/usr/lib/可以找到libz.so.1,拷貝到openwrt系統中/usr/lib/
4.3缺少libstdc++.so.6
openwrt/staging_dir/toolchain-mips_24kc_gcc-7.3.0_musl/lib里面有,通過查看可以看到是一個指向當面目錄下另一個libstdc++的軟連接。相關文件都,拷貝到openwrt系統中/usr/lib/
4.4缺少libatomic.so.1
解決方法同上