天天看点

rtplib在linux上的编译安装

JRTPlib简介

在http://www.tekuba.net/program/10/中提到过RTP的例程,这里参考网络上的资料给出JRtpLIB的嵌入式arm环境以及桌面环境开发环境的建立。

  RTP 是目前解决流媒体实时传输问题的最好办法,要在 Linux 平台上进行实时传送编程,可以考虑使用一些开放源代码的 RTP 库,如 LIBRTP、JRTPLIB 等。JRTPLIB 是一个面向对象的 RTP 库,它完全遵循 RFC1889设计,在很多场合下是一个非常不错的选择。JRTPLIB 是一个用 C++ 语言实现的 RTP 库,这个库使用Socket 机制实现网络通讯 因此可以运行在 Windows、Linux、FreeBSD、Solaris、Unix和VxWorks 等多种操作系统上。

一,x86版本JRTPLIB的编译

来源:http://www.cnblogs.com/fengqing888/archive/2011/08/16/2140464.html

1. 下载开发包解压。分别下载jrtplib-3.7.1.tar.gz和jthread-1.2.1.tar.gz。

下载地址为:http://research.edm.uhasselt.be/jori/jrtplib/jrtplib-3.7.1.tar.gz和

                      http://research.edm.uhasselt.be/jori/jthread/jthread-1.2.1.tar.gz

这里用到的软件包在115上都有。

2. 将源文件放到如下任意目录中,这里假设放到主目录下:/home/nick/。分别解压#tar -xzvf xxx,xxx为文件名。解压后出现两个目录,一个是jrtplib-3.7.1,一个是jthread-1.2.1。然后进行安装,先安装jthread,再安装jrtplib。

3. jthread安装:

       进入jthead解压目录,运行#./configure配置环境,如果出现permission denied,说明我们需要给文件configure执行的权限,运行#chmod a+x configure即可。配置完毕后运行#make,成功后再运行#make install。安装成功以后会在/urs/local/include目录下多出一个文件夹jthread。

4. jrtplib安装同上,全部安装好以后会在/urs/local/include目录下多出两个文件夹jrtplib3(可能由于版本不同,生成的文件夹名字略有不同,比如叫jrtplib-3.7.1)和jthead。复制jthead下所有文件(都是后缀为.h的头文件)到jrtplib文件夹下,目的是为了让所有头文件在一个目录下方便调用。

注意:我在编译jrtplib的时候出现如下错误:

rtperrors.cpp:206:1: warning: deprecated conversion from string constant to 'char*'

rtperrors.cpp:206:1: warning: deprecated conversion from string constant to 'char*'

rtperrors.cpp:206:1: warning: deprecated conversion from string constant to 'char*'

rtperrors.cpp:206:1: warning: deprecated conversion from string constant to 'char*'

rtperrors.cpp: In function 'std::string RTPGetErrorString(int)':

rtperrors.cpp:225:36: error: 'snprintf' was not declared in this scope

make[1]: *** [rtperrors.lo] 错误 1

make[1]:正在离开目录 `/root/vedio/JRTPLib/src-x86/jrtplib-3.7.1/src'

make: *** [all-recursive] 错误 1

下面是解决办法:来源http://www.cnblogs.com/my_life/articles/1953131.html

在 Fedora 13 中 make 提示的错误:

rtperrors.cpp: In function 'std::string RTPGetErrorString(int)':

rtperrors.cpp:225: error: 'snprintf' was not declared in this scope

为了 make 成功,需要修改 jrtplib-3.7.1 源文件 rtpdefines.h

添加如下语句 :

#include <stdio.h>

#include <stdarg.h>

#include <string.h>

5. 装好以后系统环境如下,静态动态库安装到了/usr/local/lib目录下,包括libjrtplib-3.7.1.so和libjthread-1.2.1.so等。头文件在/usr/local/include/jrtplib-3.7.1目录下。

6. 在jrtplib源代码目录里有示例程序,在目录example下,试验一下编译example1.cpp(先删除自带的编译好的example1),使用静态库libjrtp.a链接,编译链接语句如下(注意用g++而不是gcc编译,因为是链接阶段需要g++):

g++ -o example1 example1.cpp -I /usr/local/include/jrtplib/ -ljrtp

即生成应用程序exmaple1,注意,-I(大写的i)参数中路径为jrtplib头文件目录,注意:-ljrtp是小写的“L”。根据实际情况修改。如果出现错误,说明动态链接库路径不对,有以下两种方法可以对动态链接库的路径进行设置:

a、修改动态链接库宏LD_LIBRARY_PATH。LD_LIBRARY_PATH 这个环境变量是大家最为熟悉的,它告诉loader:在哪些目录中可以找到共享库。可以设置多个搜索目录,这些目录之间用冒号分隔开。export LD_LIBRARY_PATH=/usr/local/lib,然后再运行编译,即可通过。这种方法只是暂时修改路径,在重启shell后会失效。

b、永久生效的方法为修改动态链接库配置文件/etc/ld.so.conf,或者在/etc/ld.so.conf.d里创建一个新文件,并把需要的目录加到这个文件里。具体方法如下:

#cd /etc/ld.so.conf.d

#vim jrtplib 在编辑环境下加入/usr/local/lib,保存退出。

#ldconfig 重新加载动态链接库。

然后再执行编译链接,成功生成example1文件。

然后运行./example1。成功。

FROM:http://hi.baidu.com/nick0411/blog/item/8ec3a7090a6a99da63d98600.html

二,arm版JRTPLIB库的编译

参考来源:http://www.cnblogs.com/rockstone/archive/2010/01/15/1648809.html

环境:arm-linux交叉编译工具链4.4.3

           ubuntu 11.04

1,首先下载jrtplib-3.7.1和jthread-1.2.1

例如,我建立了/root/vedio/JRTPLib文件夹,在里面建立

source:存放源码压缩包

src-arm:arm版本编译的源码

src-x86:x86版本的编译的源码

target-arm:arm版本的目标文件夹(生成的文件放在这里)

target-x86:x86版本的目标文件夹(在这里我直接将x86版本的默认装载了系统目录里,见上以部分,这里不赘述)

下载上述两个文件之后,分别将他们解压到src-arm ,和 src-x86(上面的x86版本已经测试过了,这里不做介绍,直接介绍交叉编译arm版本)

2,首先编译安装 jthread

进入jthread-1.2.1文件夹

编译方法:

./configure --prefix=/root/vedio/JRTPLib/target-arm --host=arm-linux CC=arm-linux-gcc CXX=arm-linux-g++

make

make  install

在编译的时候出现了:configure: error: C compiler cannot create executables

原来是交叉编译换将的权限不对,重新安装交叉编译环境即可。

这时会看到/root/vedio/JRTPLib/target-arm多了include和lib文件。

3,编译安装jrtplib

/configure --host=arm-linux CXX=arm-linux-g++ CC=arm-linux-gcc --prefix=/root/vedio/JRTPLib/target-arm

make

在编译的时候又出现了和x86版本一样的错误

rtperrors.cpp:206: warning: deprecated conversion from string constant to 'char*'

rtperrors.cpp:206: warning: deprecated conversion from string constant to 'char*'

rtperrors.cpp: In function 'std::string RTPGetErrorString(int)':

rtperrors.cpp:225: error: 'snprintf' was not declared in this scope

make[1]: *** [rtperrors.lo] 错误 1

make[1]:正在离开目录 `/root/vedio/JRTPLib/src-arm/jrtplib-3.7.1/src'

make: *** [all-recursive] 错误 1

我们按照x86的思路,解决如下

进入src修改tperrors.h

增加:

#include <stdio.h>

#include <stdarg.h>

#include <string.h>

再执行make  make install即可。

4,尝试编译arm版本的程序

我们将/root/vedio/JRTPLib/target-arm/include中的jthread中的头文件全部拷贝到jrtplib3中,然后到src-arm目录下看到example文件夹。里面同样是测试文件,我们测试如下:

arm-linux-g++ example1.cpp -o example1  -L/root/vedio/JRTPLib/target-arm/lib  -I/root/vedio/JRTPLib/target-arm/include/jrtplib3 -ljrtp -ljthread -lpthread

结果运行生成了example1可执行文件,使用file查看其文件类型发现他是arm平台的。则我们将/root/vedio/JRTPLib/target-arm/include中的头文件和/root/vedio/JRTPLib/target-arm/lib中的库文件拷贝到arm开发板上即可。

        由这几次编译库我们可以发现,主要的步骤就是先编译依赖库,取得编译依赖库得到的头文件和库文件,在编译最终我们需要的库的时候,我们需要制定依赖库头文件和依赖库的位置,就像-L/root/vedio/JRTPLib/target-arm/lib  -I/root/vedio/JRTPLib/target-arm/include/jrtplib3这种结构,所谓的移植不过如此而已。

ps:关于使用jrtplib库编程例程详见“linux系统编程”部分。

感谢:http://www.cnblogs.com/rockstone/archive/2010/01/15/1648809.html

本文来源于特酷吧http://www.tekuba.net/, 原文地址:http://www.tekuba.net/program/178/

继续阅读