OpenWrt/LEDE中使用qt库
原创文章,转发请注明链接和作者。(而且作者很懒,没有检查错别字)
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
解决方法同上