=====这个工作是 2019年3月6日的事情了,当时花了好几天功夫, 今天刚好有空, 晚上失眠,就写下blog吧===,另外受一个在大学做博导的朋友的委托, 帮他指导他的学生的毕业设计,最后还得了优秀奖, 那个学生做的是 mini 播放器 ====
环境:
Virtual box + ubuntu 1804
文件目录 ,e:\tools\VirtualBox\ubuntu18042-2\ubuntu18042\
vb 设置, 网络 , 桥接 ,
安装 ubuntu 后,
默认是 开启了DHCP ,
不管是 nat 还是 桥接模式, 都是自动可以上 互联网的
为了 使用指定的ip , 最好配置为静态ip
# sudo apt-get install -y net-tools
# ifconfig 查看ip 地址
安装 openssh-server
方便 windows 通过 ssh 和 虚拟机通讯了
winscp + putty 或者 xshell
sudo apt-gt install -y openssh-server
apt-get: Could not resolve 'archive.ubuntu.com'
解决方案 :
https://blog.csdn.net/imvkmark/article/details/44088221
修正方法是:
http://ip.tool.chinaz.com/archive.ubuntu.com
archive.ubuntu.com 91.189.88.149 1539135637 英国 canonical公司
archive.ubuntu.com91.189.88.161 1539135649 英国 canonical公司
archive.ubuntu.com91.189.88.162 1539135650 英国 canonical公司
archive.ubuntu.com91.189.88.152 1539135640 英国 canonical公司
step 1: 修改host /etc/hosts
添加如下映射
91.189.91.93 archive.ubuntu.com91.189.91.93 security.ubuntu.com
step 2: 重启network服务
$ /etc/init.d/networking restart ,
sudo apt-gt install -y openssh-server
$ /etc/init.d/networking restart
winscp 成功 通过 sfts 链接到 虚拟机的 192.168.1.103
这里有gcc的 各种版本 http://mirror.hust.edu.cn/gnu/gcc/,
没有必要 考虑 linux的 gcc 版本,
只需要考虑 交叉编译的gcc版本
下载交叉编译工具链
arm-linux-gnueabihf-gcc
SDL2 交叉编译参考 网址 :
https://blog.csdn.net/u012075739/article/details/25030029
https://blog.csdn.net/lg1259156776/article/details/52281323
下载地址
https://pan.baidu.com/s/1pJ2rdkZ?errno=0&errmsg=Auth%20Login%20Sucess&&bduss=&ssnerror=0&traceid=
在自己的 主目录下面 创建 子目录 project
下载 gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux.tar.xz
到 ~/project
cd ~/project
xz -d gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux.tar.xz
tar -xvf gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux.tar
cd gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin
ls 查看下文件
./gcc-linaro-arm-linux-gnueabihf-4.9 -v
发现 下面的问题,
由于下载的 gcc-linaro-arm-linux-gnueabihf-4.9.1 是32bit的, 而自己的电脑是 64 bit的, 因此需要下载 补丁库,
sudo apt-get isntall -y lib32ncurses5
执行 gcc-linaro-arm-linux-gnueabihf-4.9.1 -v
或者
gcc-linaro-arm-linux-gnueabihf -v
提示 缺少 libstdc++.so.6
sudo apt-get install lib32stdc++6
sudo apt-get install lib32z1
编辑 ~/environment
把 交叉编译器的 的path 添加到系统的环境变量中
或者 export PATH=$PATH:/home/lgl/project/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin
然后 在 任意路径下 测试
gcc-linaro-arm-linux-gnueabihf -v
显示正确的信息就ok了
上面的 操作 已经 安装完毕 交叉表编译器了
https://blog.csdn.net/zhouzhenhe2008/article/details/54428761
这个 是 linux 主机上安装 sdl2 的 方法
先在主机上测试 sdl2 , 然后 再 交叉编译 移植到开发板
执行这两个命令就可以了
sudo apt-get install libsdl2-2.0
sudo apt-get install libsdl2-dev
引用SDL2库编译自己的程序
gcc -o myprogram myprogram.c `sdl2-config --cflags --libs`
cd test
sudo ./configure
sudo make
./loopwave 测试效果
file loopwave 使用该命令 可以查看文件loopwave的格式,到底是 x86-64,还是arm-32bit的 ,
这时usr/SDL/SDL-1.2.15/test文件夹下回生成许多SDL测试文件,随便键入一个./loopwave欣赏效果
下面有 很多个测试文件, 测试效果很一般 。
接下来 进行 sdl 库的交叉编译 ,和 测试程序的交叉编译
========================现在directfb-example的 部分demo 已经可以跑通========
SDL 依赖于 DirectFB 和 zlib ,png(需依赖zlib),jpeg , freetype 几个基本的库,
关键是看你要实现哪些功能,不够的话,按照本文章的思路 自己去下载,编译,
DirectFB依赖库:freetype.2.4.4.tar.gz,jpegsrc.v8c.tar.gz,libpng-1.2.44.tar.gz,zlib-1.2.5.tar.gz
DirectFB-1.2.7.tar.gz 下载地址 https://download.csdn.net/download/u012075739/7337589
freetype.2.4.4.tar.gz,jpegsrc.v8c.tar.gz,libpng-1.2.44.tar.gz,zlib-1.2.5.tar.gz
下载链接 , https://blog.csdn.net/u012075739/article/details/25030029
编译顺序 :zlib ,png(需依赖zlib),jpeg , freetype ,
DirectFB, DirectFB-example
SDL, SDL-example
之所以 选择这些版本的,也是经前人证明是可行的, 你也可以下载新的版本, 但那些和哪些匹配需要花时间去确认 的
时间充分的朋友 可以下载相对比较新的版本。
这些 export 不建议放在 /etcc/profile 或者其他的 环境变量文件中, 避免污染原来的linux 系统。
这些命令 可以直接拷贝到 终端界面执行的, 一次性按顺序执行很多条的 , 所以效率还是挺高的 。
export PATH=$PATH:/home/lgl/project/gcc-linaro-arm-linux-gnueabihf-4.9-2014.07_linux/bin
export PATH=$PATH:/home/nation/libpng-arm/bin/libpng-config
export CC=arm-linux-gnueabihf-gcc
export CXX=arm-linux-gnueabihf-g++
export AR=arm-linux-gnueabihf-ar
export RANLIB=arm-linux-gnueabihf-ranlib
export NM=arm-linux-gnueabihf-nm
export AS=arm-linux-gnueabihf-as
export LD=arm-linux-gnueabihf-ld
export STRIP=arm-linux-gnueabihf-strip
export READELF=arm-linux-gnueabihf-readelf
export STRINGS=arm-linux-gnueabihf-strings
export SIZE=arm-linux-gnueabihf-size
export ADDR2LINE=arm-linux-gnueabihf-addr2line
export HOST=arm-linux-gnueabihf
export ZLIB=/home/nation/zlib-arm
export LIBPNG=/home/nation/libpng-arm
export LIBJPEG=/home/nation/libjpeg-arm
export FREETYPE=/home/nation/freetype-arm
export DIRECTFB=/home/nation/directFB-arm
export PKG_CONFIG_PATH=/
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/nation/zlib-arm/lib/pkgconfig
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/nation/libpng-arm/lib/pkgconfig
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/nation/libjpeg-arm/lib/pkgconfig
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/nation/freetype-arm/lib/pkgconfig
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/home/nation/directFB-arm/lib/pkgconfig
export PKG_CONFIG_PATH=/home/nation/zlib-arm/lib/pkgconfig:/home/nation/libpng-arm/lib/pkgconfig:/home/nation/libjpeg-arm/lib/pkgconfig:/home/nation/freetype-arm/lib/pkgconfig:/home/nation/directFB-arm/lib/pkgconfig
#=====zlib====================
cd zlib-1.2.44
export ZLIB=/home/nation/zlib-arm
export CC=arm-linux-gnueabihf-gcc
./configure --prefix=/home/nation/zlib-arm
make clean
make
make install
# ======libpng , depon on zlib========
cd libpng-1.2.50
export ZLIB=/home/nation/zlib-arm
export LIBPNG=/home/nation/libpng-arm
export LDFLAGS="-L$ZLIB/lib -lz -lm"
export CPPFLAGS="-I$ZLIB/include"
./configure --host=arm-linux-gnueabihf --prefix=/home/nation/libpng-arm --enable-shared=yes
make clean
make
make install
#./configure --host=arm-linux-gnueabihf --prefix=/home/nation/libpng-arm --enable-shared ac_cv_func_malloc_0_nonnull=yes
#======jpeg , only this jpeg ,have no pkgconfig actually====
cd jpeg-8c
export LIBJPEG=/home/nation/libjpeg-arm
./configure --host=arm-linux-gnueabihf --prefix=/home/nation/libjpeg-arm --enable-shared
make clean
make
make install
# ========freetype================
cd freetype-2.4.4
export FREETYPE=/home/nation/freetype-arm
./configure --host=arm-linux-gnueabihf --prefix=/home/nation/freetype-arm
make clean
make
make install
# ======= DirectFB===========
cd DirectFB-1.4.5
unset LDFLAGS
unset CFLAGS
export LDFLAGS="$LDFLAGS -L$ZLIB/lib -L$LIBPNG/lib -L$LIBJPEG/lib -L$FREETYPE/lib -lz -lm -lpng -ljpeg -lfreetype "
export CFLAGS="$CFLAGS -I$LIBJPEG/include -I$LIBPNG/include -I$FREETYPE/include -I$ZLIB/include"
export DIRECTFB=/home/nation/directFB-arm
./configure --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --prefix=/home/nation/directFB-arm --with-gfxdrivers=none --with-inputdrivers=all --enable-freetype=yes --enable-png=yes --enable-jpeg=yes --enable-zlib==yes --enable-sdl --enable-gif --enable-debug --sysconfdir=/etc --enable-fbdev --disable-x11 --enable-shared
make clean
make
make install
=======出错处理=================
1、编译 freetype的 时候 出错了
rmdir: failed to remove '/home/usr/include/freetype2/freetype/internal': No such file or directory
/home/lgl/project/depondency4SDL-ARM/freetype-2.4.4/builds/unix/install.mk:31: recipe for target 'install' failed
make: [install] Error 1 (ignored)
这个错误 从网上查看 有人说 不影响, 那就继续搞呗
dirctfb的 configure 阶段 :
2、这里注意 需要 修改 2 个地方 ,
DirectFB在configure阶段会出现警告 ,结果就是 不支持jpeg 和png , 那这个基本功能就没有了
PNG support is missing - many applications won't work correctly!
JPEG support is missing - many applications won't work correctly!
configure 找到 JPEG=no 和 PNG=no 的定义,
修改为
JPEG=yes
PNG=yes
3、另外 libpng在编译的时候 ,需要 特殊处理 ,
export PATH=$PATH:/home/nation/libpng-arm/bin/libpng-config
不然 DirectFB 在configure 阶段 还是 警告
PNG support is missing - many applications won't work correctly!
4、 DirectFB 在make 阶段 出错 :
make[2]: Entering directory '/home/nation/DirectFB-1.2.7/tools'
../src/.libs/libdirectfb.so: undefined reference to `gzclose'
../src/.libs/libdirectfb.so: undefined reference to `gzdopen'
../src/.libs/libdirectfb.so: undefined reference to `gzwrite'
collect2: error: ld returned 1 exit status
Makefile:481: recipe for target 'dfbdump' failed
make[2]: *** [dfbdump] Error 1
make[2]: Leaving directory '/home/nation/DirectFB-1.2.7/tools'
Makefile:419: recipe for target 'all-recursive' failed
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory '/home/nation/DirectFB-1.2.7'
Makefile:305: recipe for target 'all' failed
make: *** [all] Error 2
类似的错误用类似的解决办法: 加上-lm -lz
vi tools/Makefile
LDFLAGS = -L/forlinx/build/tslib/lib -L/forlinx/build/libjpeg/lib -L/forlinx/build/libpng/lib -
L/forlinx/build/freetype/lib -L/forlinx/build/zlib/lib -lm -lz
#=========== DirectFB-examples=================== TSLIB 是触摸屏才使用===
####简单的 处理 可能是 arm-none-linux-gnueabi-gcc `pkg-config --cflags --libs directfb`fb.c -o fb
cd DirectFB-examples-1.2.0
unset LDFLAGS
unset CFLAGS
export LDFLAGS="$LDFLAGS -L$LIBJPEG/lib -L$LIBPNG/lib -L$FREETYPE/lib -L$ZLIB/lib -L$DIRECTFB/lib"
export CFLAGS="$CFLAGS -I$LIBJPNG/include -I$LIBJPEG/include -I$FREETYPE/include -I$ZLIB/include -I$DIRECTFB/include"
./configure --host=arm-linux-gnueabihf --prefix=/home/nation/directFB-example-arm
make
make install
========下面将编译的结果拷贝到开发板上 运行========================
.将install生成后的文件夹拷贝至板子上
hwinfo --framebuffer
查看下板子的硬件信息
1、 在开发板 上
创建目录 /home/nation
把之前编译安装的文件 拷贝过去
/home/nation/zlib-arm/lib
/home/nation/libpng-arm
/home/nation/libjpeg-arm
/home/nation/freetype-arm
/home/nation/directFB-arm/lib
========
2、将路径,lib等信息导入到环境变量/etc/profile中
export DFB_ROOT=/usr/local/dFB-1.4.3
export PKG_CONFIG_PATH=$DFB_ROOT/lib/pkgconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DFB_ROOT/lib
------------------
3、 ####/编辑 etc/ld.so.conf#####
include /etc/ld.so.conf.d/*.conf
/home/nation/zlib-arm/lib
/home/nation/libpng-arm
/home/nation/libjpeg-arm
/home/nation/freetype-arm
/home/nation/directFB-arm/lib
然后执行命令 ldconfig
4、 编辑 /etc/direcfbrc
system=fbdev
fbdev=/dev/fb0
wm=default
mode=1024x768-60
depth=32
pixelformat=RGB32
===== 不能 采用 rgb16的 很模糊的, , 这个32位的配置,经过测试是可以接受的
重启 开发板,让配置生效
5、 运行 demo 程序 ,
cd /home/nation/directFB-arm/bin
sudo chmod a+x /home/nation/directFB-arm/bin/*
sudo ./df_dok
目前 一下几个 demo 程序可以不报错的 运行了 , 其他的demo 需要检查具体原因,一般是缺少支持的库 , 需要检查源代码 , 最好的方法是先在 pc 上 编译测试 demo, 然后再 移植到 开发板上 。
df_dok
df_window
df_stress
df_particle
在pc下验证 , 结果
directFB 的 configure 都通不过,
估计 是 gcc 这些编译工具的 版本 不匹配吧,
看似简单的问题,其实很复杂 , 因为你下载的这些 库的源码,都是N多年前的 ,
查找关于png方面的包: $apt-cache search libpng
其他demo 为什么运行 出错 , 需要花很多时间去排查, 暂时不影响进度, 暂时不去处理它。
另外一种排查方法, 是在 嵌入式版本的 源码中加入调试信息 。
=====交叉编译SDL 和 sdl example =====
懂网上看的文章 , 感觉 SDL 并不一定需要依赖 DirectFframeBuffer , 既然如此,
可以再尝试 直接编译SDL , 当然又要依赖很多其他的库,
尝试一下吧, 这个是比directfb更高级的接口, 使用起来应该更方便。
下面参考文章交叉编译 sdl2.0
export SDL2=/home/lgl/project/SDL2-2.0.9-ARM
sudo ./sdl.sh
错误1: 找不到 SDL_config.h
错误1:找不到 SDL_config.h.png
#ifdef USING_GENERATED_CONFIG_H
#error Wrong SDL_config.h, check your include path?
#endif
Solution
由于是定义来这个宏,导致错误,所以我们移除这个宏。
在SDL2源码目录下的CMakeLists.txt中,找到USING_GENERATED_CONFIG_H, 并且修改成如下
# 把原来的注释掉# add_definitions(-DUSING_GENERATED_CONFIG_H)# 添加移除掉这个宏remove_definitions(-DUSING_GENERATED_CONFIG_H)
/home/lgl/project/SDL2-2.0.9/src/atomic/SDL_spinlock.c:147: undefined reference to `SDL_Delay_REAL'
#define SDL_Delay_REAL SDL_Delay
extern DECLSPEC void SDLCALL SDL_Delay(Uint32 ms);
--disable-video-mir 这个 无法识别 , 去掉
locate sdl2-config
(directfb 编译的 ,)http://blog.csdn.net/u012075739/article/details/25159849 -
------ ( directfb 编译的 https://blog.csdn.net/ostar_liang/article/details/17353783 )
https://www.cnblogs.com/doctorbill/articles/3791541.html (编译 directfb的 )
上面2片 博客,才是嵌入式linux 编译安装sdl2的 方法
经过 改造 去掉 mouse 后的 df_video
df_video.c <93>:
(#) DirectFBError [dfb->CreateVideoProvider( dfb, argv[1], &videoprovider )]: No (suitable) implementation found!
sudo ./df_video complete.wav
https://blog.csdn.net/kof98765/article/details/18264859
SDL-1.2.14 交叉编译
DirectFB通过对FFmpeg进行封装,形成一组统一接口方便用户调用
来源:oschina
链接:https://my.oschina.net/lvguanglin/blog/3156106