基于开发板 香橙派 Orange Pi PC PLUS 的 SDL 2交叉编译 ,并运行demo程序

房东的猫 提交于 2020-02-27 18:32:57

=====这个工作是 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进行封装,形成一组统一接口方便用户调用

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!