ffmpeg、jrtp、SDL的交叉编译

因为需要,重新使用最新的交叉编译器arm-linux-gcc 4.3.2编译了所需要的SDL、ffmpeg、rtp库。其他交叉编译器过程类似,可能遇到不同的问题,视情况解决。

一、SDL的编译

        SDL-1.2.13。

       ./configure --prefix=/weili/SDL --disable-video-qtopia --disable-video-dummy --disable-video-fbcon --disable-video-dga --disable-arts --disable-esd --disable-alsa --disable-cdrom --disable-video-x11 --disable-nasm --target=arm-linux --host=arm-linux --enable-video-fbcon

       make

       make install

       看情况改变prefix目录和各种选项。make install之后便在prefix目录下生成所需的动态库和include头文件等等。

二、jrtp的编译

      编译rtp库要先编译jthread库,然后在编译jrtp库。我使用的是jthread-1.2.1.tar.gz jrtplib-3.7.1.tar.gz。

      1. 进入jthread-1.2.1

           ./configure -host=arm-linux -prefix=/weili/jthread/

          make

          make install

          这样jthread库就安装在了/weili/jthread/lib下面了 libjthread.so

      2.进入jrtplib-3.7.1

        ./configure --host=arm-linux -prefix=/weili/jrtp/ -with-jthread-includes=/weili/jthread/include/jthread/ CPPFLAGS=-I/weili/jthread/include/jthread LDFLAGS=-L/weili/jthread/lib/

       make

        make install

       我编译的时候出现mecpy在rtppacket.cpp和rtcpcompoundpacketbuilder.cpp未定义的错误,然后在这两个.cpp头中加入#include <string.h>就可以了。

       最后在/weili/jrtp/lib中就生成了需要的libjrtp库。

三、ffmpeg的编译

       一开始我使用了ffmpeg-0.4.9-p20060530,结果出现错误In file included from mathematics.c:24:
common.h:619: error: static declaration of 'lrintf' follows non-static declaration
make[1]: *** [mathematics.o] Error 1
make[1]: Leaving directory `/weili/ffmpeg-0.4.9-p20060530/libavutil'
make: *** [lib] Error 2,不知道为什么,然后就换用ffmpeg_src_20071007.rar了。

       首先下载解压后configure,

       ./configure --prefix=/weili/ffmpeg/ --enable-shared --cross-compile --cc=arm-linux-gcc --arch=arm --enable-gpl --disable-strip --disable-network --disable-ipv6 --disable-vhook --disable-mpegaudio-hp --enable-pthreads --enable-small --disable-parsers --disable-debug --disable-armv5te --disable-armv6

      执行时可能出现bash: ./configure: /bin/sh: bad interpreter: No such file or directory
原因是那个configure是在windows下写的,所以脚本就不能运行了。解决办法:把windows下的configure转换成Linux下的,执行命令 dos2unix configure 如果没有 dos2unix命令就安装个,很简单,下一个dos2unix-3.1.tar装上就行了。

      因为我没用到x264就没enable,注意如果需要x264要首先安装x264库。

     然后make。我中间出现一些错误。

     armv4l/dsputil_arm_s.S:79: Error: selected processor does not support `pld[r1]'

           解决:PLD这个指令,只有ARM5以上才支持,而此处,我的配置是arm922T,属于arm4,
不支持这个指令,可以直接忽略它。所以,用下面这个方法,手动添加通过宏定义判断,就可以避开此问题了:也就是,修改dsputil_arm_s.S,在前面添加上:

                    #ifndef HAVE_PLD
                    .macro pld reg
                    .endm
                     #endif
      记得第一次编译的时候还出现其它错误,经过修改才好使,不过后来再编译就没什么错误了。直接make就通过了,最后make install,之后再/weili/ffmpeg/下就生成了需要的ffmpeg库。

      但最后应用,发现mpeg4的解码器不能用,其它的都能用,不知道什么原因。所以改用了其它解码器来应用,可以。//后又经测试,可以用mpeg4。




目前jrtplib的版本已经更新到了3.9.1,现在用的自动编译脚本已经被作者改成了cmake。由于最近需要在armv5的板子下开发视频应用,因此准备把该库移植过去。转载请注明作者:jwybobo2007。移植前先在baidu和google上搜索了下,没有找到有关jrtplib 3.9.1的交叉编译方法,能找到的就是3.7.1版本的编译方式,那时候直接是用的configure,make来编译的。既然没找到,那就只能自己研究一下,然后动手编译(现在的人真的是很依赖搜索引擎了,就像我,凡事都先搜索,找不到答案时,才自己去动脑研究,真是悲剧啊),下面介绍一下几个步骤。

  1.下载该库以及jthread后,分别解压,在解压目录中能看到一个CMakeList.txt的文件

  2.安装cmake ,g++

        3.运行 cmake . (不要忘记这个点 "." )生成CMakeCache.txt  

        4.将里面的/usr/bin/c++   替换成     /root/CodeSourcery/Sourcery_G++_Lite/bin/c++

                           /usr/bin/gcc    替换成    /root/CodeSourcery/Sourcery_G++_Lite/bin/gcc

        5. 然后make 生成的 为arm-linux 平台下的jrtplib库


以下内容摘抄自网络


[cpp] view plaincopy
  1. #告知当前使用的是交叉编译方式  
  2. SET(CMAKE_SYSTEM_NAME Linux)  
  3. #设置c编译器  
  4. SET(CMAKE_C_COMPILER "arm-none-linux-gnueabi-gcc")  
  5. #设置c++编译器  
  6. SET(CMAKE_CXX_COMPILER "arm-none-linux-gnueabi-g++")  
  3.切换目录至 jthread 解压目录,执行 cmake CMakeList.txt

  4.make, make install  此时jthread库安装完毕,默认安装到/usr/local

接下来编译jrtplib

  5.切换目录至jrtplib解压目录,执行cmake CMakeList.txt

  6.执行完后,根据大小端情况先修改src文件夹下的rtpconfig.h

  默认情况下会定义大端宏:

[cpp] view plaincopy
  1. #define RTP_BIG_ENDIAN  

  如果用的是小端序,把这个宏屏蔽掉

  7.由于板子上的linux操作系统可以在没有用户名的情况下登录,所以rtpsession.cpp中的CreateCNAME可能报Can't retrieve login name的错误,因此需要修改几句代码:

[cpp] view plaincopy
  1. if (!gotlogin)  
  2. {  
  3.     char *logname = getenv("LOGNAME");  
  4.     if (logname == 0)  
  5.     {  
  6.         strncpy((char*)buffer, "root", *bufferlength);  
  7.     }  
  8.     else  
  9.         strncpy((char *)buffer,logname,*bufferlength);  
  10. }  

  8.make, make install

  执行成功后就OK了,现在可以写代码测试了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值