赞
踩
由于工作的需要,需要交叉编译一个嵌入式截屏工具,通过网上的查询,用的比较多的就是gsnap。网上也有比较多的资料,参考里的资料基本就是我参考的一些资料了,写的还是不错的,但有些可能会有一些问题,所以,我记录一下我自己实测的情况。
前提条件:
嵌入式机器要支持/dev/fb0这个设备节点。不然,这个工具基本就使用不了了。
原理:
由于 Linux 系统的 FrameBuffer 机制,把屏幕上的每个点映射成一段线性内存空间,这样,程序就可以通过改变这段内存的值来改变屏幕上某一点的颜色。如果我们想把当前的显示内容保存起来,可能会想到如下命令:
cat /dev/fb0 > fb_data.raw
反过来,可以将这些数据回显到 framebuffer 中:
cat fb_data.raw > /dev/fb0
但是,用这用方法保存起来的数据是原始数据,只有专用软件才能打开,并且大小固定(如:8MB)。基于这些原因,我们找到一个不错的工具——gsnap,这个工具可以将 framebuffer 的数据保存为图片(png或jpeg格式)。
交叉编译的主机为Ubuntu 16.04
使用的交叉编译器为: arm-linux-gnueabihf-gcc
交叉编译器的下载地址为: https://blog.51cto.com/u_15127589/4102404
我这边直接选择的版本就是最新的:
安装方式就直接在root下面执行: sudo apt install gcc-arm-linux-gnueabihf
测试方式:arm-linux-gnueabihf-gcc -v
首先,进入那个资源文件夹中可以看到:
建议你们是把出.tar…gz的其他文件都先删掉。因为那些是我解压且修改后的文件。你要是用那些,有可能自己的编译器有问题,都没有发现。
首先,在这个目录下创建一个install的目录,来存放生成的依赖库。
然后,将所有的.tar.gz都解压在当前目录即可。命令: tar -zxvf *****.tar.gz
各个依赖库的交叉编译次序:jpeg --> zlib --> libpng --> gsnap。
先进行libjpeg编译,在ubuntu中执行以下命令,进行交叉编译:
# cd /work/gsnap/gsnap_build_all_src/jpeg-9d
# export CC=arm-linux-gnueabihf-gcc
# ./configure --host=arm-linux-gnueabihf --prefix=/work/gsnap/gsnap_build_all_src/install/jpeg
# make -j4
# make install
# cd /work/gsnap/gsnap_build_all_src/zlib-1.2.11
# export CC=arm-linux-gnueabihf-gcc
# ./configure --prefix=/work/gsnap/gsnap_build_all_src/install/zlib
# make -j4
# make install
# cd /work/gsnap/gsnap_build_all_src/libpng-1.6.37
# cp scripts/makefile.linux Makefile -a
然后,makefile相应更改一下:
然后,执行
# make -j4
# make install
a. 首先,我们进入后,修改一下Makefile。Makefile修改成这样;
all:
#$(CC) -g gsnap.c -L/usr/lib -lpng -ljpeg -lz -lm -o gsnap
arm-linux-gnueabihf-gcc -g gsnap.c \
-L /work/gsnap/gsnap_build_all_src/install/png/lib \
-L /work/gsnap/gsnap_build_all_src/install/jpeg/lib \
-L /work/gsnap/gsnap_build_all_src/install/zlib/lib \
-I /work/gsnap/gsnap_build_all_src/install/png/include \
-I /work/gsnap/gsnap_build_all_src/install/jpeg/include \
-I /work/gsnap/gsnap_build_all_src/install/zlib/include \
-lpng -ljpeg -lz -lm -o gsnap
clean:
rm -f gsnap
里面的路径注意要相对应改成你所当前环境下的。
b. 执行make all
,执行完后,我们就可以看到当前文件夹下生成一个gsnap的可执行文件:
接下来,将这个gsnap的可执行文件拷贝到:/bin
下面。
将一些依赖库拷贝到\lib
目录下面。
执行以下命令,可以进行屏幕截图:gsnap fb.jpg /dev/fb0
执行完后,你就可以在/bin的目录下找到一个fb.jpg,将其拷贝出来,就可以进行显示了。
如果是我上面的环境下的话,应该就可以直接使用我上面所编译出来的可执行文件,将其拷贝到对应的环境中,然后将对应的苦拷贝到对应的/lib环境中,从而,再执行gsnap fb.jpg /dev/fb0
这句后,就可以执行进行截图操作,而不用自己进行编译。
环境相关:
4. ARM-Linux开发 arm-none-Linux-gnueabi-gcc下载安装
5. make:arm-linux-gnueabihf-gcc:command not found 问题解决
6. arm-linux-gnueabihf编译工具链安装
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。