在ubuntu14.04.1中将qt4.8.6移植到基于hi3520d的nvr上
2016-06-11 12:21
706 查看
准备工作
在开始之前,你需要有在同一局域网内的一台宿主机(在上面装一台虚拟机)、一台基于hi3520d的nvr。我的宿主机是win8.1,虚拟机是virtual box+ubuntu:
virtual box安装包(VirtualBox-5.0.10-104061-Win.exe)
ubuntu镜像(ubuntukylin-14.04.1-desktop-i386.iso)
你还要有:
hi3520d交叉编译环境(arm-hisiv100nptl-linux.zip)
mpp头文件及库(mpp.zip)
qt4.8.6源码(qt-everywhere-opensource-src-4.8.6.tar.gz)
qt creator3.5.1安装包(qt-creator-opensource-linux-x86-3.5.1.run)
在ubuntu上mkdir qt,将宿主机上的qt-everywhere-opensource-src-4.8.6.tar.gz、qt-creator-opensource-linux-x86-3.5.1.run拖进去
让ubuntu与宿主机、nvr互通
将ubuntu的网卡改为桥接网卡。先在宿主机、nvr上ping ubuntu,如果ping不通,手动设置ubuntu的ip让他们在同一网段上且子网掩码相同。再在ubuntu上ping宿主机,如果ping不通,把宿主机的防火墙关掉。接着,sudo apt-get install nfs-kernel-server
sudo gedit /etc/exports
添加/ *(rw,sync,no_root_squash)
sudo /etc/init.d/nfs-kernel-server restart
配置好ubuntu上的nfs服务之后,在nvr上
mount -t nfs -o nolock ubuntu的ip:/ /mnt
就可以在nvr上通过/mnt目录访问ubuntu上的根目录了
安装本机编译环境
sudo apt-get install build-essential
安装交叉编译环境
cd nvrunzip mpp.zip
unzip arm-hisiv100nptl-linux.zip
cd arm-hisiv100nptl-linux
chmod +x cross.install
sudo ./cross.install
安装qt creator
cd qtchmod +x qt-creator-opensource-linux-x86-3.5.1.run
./qt-creator-opensource-linux-x86-3.5.1.run
编译arm版的qt
cd qttar zxvf qt-everywhere-opensource-src-4.8.6.tar.gz
mv qt-everywhere-opensource-src-4.8.6 qt-arm
cd qt-arm/mkspecs/qws/linux-arm-g++
gedit qmake.conf
将所有的arm-linux替换为arm-hisiv100nptl-linux
gedit qplatformdefs.h
添加#undef O_CLOEXEC,防止在编译过程中报找不到accept4的错
cd qt/qt-arm
./configure -prefix /opt/qt-arm -opensource -confirm-license -fast -no-largefile -no-exceptions -no-accessibility -no-qt3support -no-xmlpatterns -no-multimedia -no-audio-backend -no-phonon -no-phonon-backend
-no-svg -no-webkit -no-javascript-jit -no-script -no-scripttools -no-declarative -no-declarative-debug -xplatform qws/linux-arm-g++ -qt-gfx-linuxfb -no-mmx -no-3dnow -no-sse -no-sse2 -no-sse3 -no-ssse3 -no-sse4.1 -no-sse4.2 -no-avx -no-neon -qt-zlib -no-gif
-no-libtiff -qt-libpng -no-libmng -qt-libjpeg -no-openssl -nomake demos -nomake examples -nomake docs -nomake tools -no-rpath -no-nis -no-cups -no-iconv -no-pch -no-dbus -embedded arm -little-endian
make
sudo make install
这样编译出的libQtCore、libQtGui大小分别是3.6mb、12mb,tgz压缩后6.2mb
我们的nvr,flash只有10mb,不可删除的daemon.exe、nvr_main.tgz、startapp、startapp_t占3071.6kb(2.9mb),也就是说nvr_gui.tgz最大不能超过7168.4kb(7mb),除去qt库所占的6.2mb,留给程序的只有0.8mb!在包含字体文件的情况下,这显然是不够用的,只能继续裁剪libQtGui了,如果工程比较简单的话,除此之外还有一个选择,那就是minigui。如果flash超过16mb的话,qt就是你的不二选择了。
-rw-r--r-- 1 root root 3.0M Oct 7 08:54 WWW.tgz
-rwxr-xr-x 1 root root 507.2K Apr 24 2015 daemon.exe
drwxr-xr-x 3 root root 0 Apr 24 2015 hiapp
-rw-r--r-- 1 root root 0 Oct 6 15:29 noreboot
-rw-r--r-- 1 root root 4.2M Nov 18 13:31 nvr_gui.tgz
-rw-r--r-- 1 root root 2.5M Aug 31 11:12 nvr_main.tgz
-rwxr-xr-x 1 root root 2.2K Apr 24 2015 startapp
-rwxr-xr-x 1 root root 2.2K Apr 24 2015 startapp_t
编译pc版的qt
cd qttar zxvf qt-everywhere-opensource-src-4.8.6.tar.gz
mv qt-everywhere-opensource-src-4.8.6 qt-pc
./configure TODO
make
sudo make install
在nvr上运行chip
chip是qt自带的demo,位于qt/qt-arm/demos/chip目录下修改chip.pro,添加:
INCLUDEPATH += /home/mynamepfd/nvr/mpp/include
LIBS += -L/home/mynamepfd/nvr/mpp/lib -lmpi
修改main.cpp,头文件部分添加:
#if 1
#include "hi_common.h"
#include "hi_type.h"
#include "hi_comm_vo.h"
#include "mpi_vo.h"
#include "hifb.h"
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/mman.h>
#include <linux/fb.h>
#endif
main函数开头添加:
#if 1
int fd;
HIFB_POINT_S stPoint = {0, 0};
VO_PUB_ATTR_S stPubAttr = {0};
HIFB_ALPHA_S stAlpha;
HIFB_COLORKEY_S stColorKey;
struct fb_fix_screeninfo fix;
struct fb_var_screeninfo var;
HI_MPI_VO_SetPubAttr(0, &stPubAttr);
HI_MPI_VO_Enable(0);
fd = open("/dev/fb0", O_RDWR);
ioctl(fd, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint);
ioctl(fd, FBIOGET_VSCREENINFO, &var);
var.xres = var.xres_virtual = 1024;
var.yres = 768;
var.yres_virtual = 768;
/* ARGB8888 */
var.transp= {24, 8, 0};
var.red = {16, 8, 0};
var.green = {8, 8, 0};
var.blue = {0, 8, 0};
var.bits_per_pixel = 32;
ioctl(fd, FBIOPUT_VSCREENINFO, &var);
stAlpha.bAlphaEnable = (HI_BOOL)0;
stAlpha.bAlphaChannel = (HI_BOOL)0;
stAlpha.u8Alpha0 = 0xff;
stAlpha.u8Alpha1 = 0x8f;
stAlpha.u8GlobalAlpha = 0x80;
ioctl(fd, FBIOPUT_ALPHA_HIFB, &stAlpha);
stColorKey.bKeyEnable = (HI_BOOL)1;
stColorKey.u32Key = hifb_color2key(&var, 0x00001f);
ioctl(fd, FBIOPUT_COLORKEY_HIFB, &stColorKey);
#endif
这段代码是为了打开nvr上的fb0
在nvr上,mount好之后cd到chip所在目录,先export一些chip运行用到的环境变量:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/mnt/opt/qt-arm/lib
export QT_QWS_FONTDIR=/mnt/opt/qt-arm/lib/fonts
export QT_QWS_DISPLAY="linuxFB:/dev/fb0"
之后,./chip -qws
相关文章推荐
- MQTT基础——Part 1. 认识MQTT
- qtcreator打开cmakelists工程
- Qtcreator快捷键
- Qt之OpenSSL(有pro文件的路径格式,以及对libeay32和ssleay32的引用)
- PYQT 自动resize 随着内容自动变化长度
- C++--Qt使用Http协议
- Qt的Socket数据通讯的一个例子。
- Qt5.3企业版和开源版功能区别
- Qt在各平台上的搭建qt-everywhere
- qt 操作word
- Qt SQL Programming 部分翻译
- Qt Creator error: LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- Qt 错误: 无法运行 release 下的可执行文件
- Qt 技巧:设置在 debug 路径下直接运行可执行文件
- Qt 技巧:去除对话框边框 + 设置窗口可移动和透明
- Qt布局与分割器QSplitter
- Qt中addStretch的有趣应用
- Qt Creator插件工作流程代码走读
- QT中的qmake详解
- Qt setStyleSheet 添加背景色/背景图片(取消背景色,读取本地文件作为背景色)