linphone3.2.1 交叉编译详细记录

嵌入式环境中可能会用到linphone进行VOIP通信,下面是我使用 RK3588平台进行交叉编译的详细过程。其中有许多注意事项,包括一些疑问,欢迎大家批评指正,共同讨论。

1,先做准备工作,下载以下必须的支持库源码包,(列表顺序与编译顺序无关)

gsm-1.0-pl13,     libogg-1.1.3,    speex-1.2rc1,    libeXosip2-3.3.0,   libosip2-3.3.0  openssl -1.1.0f, linphone-3.2.1

2,开始编译,先说一下编译顺序

libogg->speex->osip->openssl->exosip2->linphone

下面正式开始编译说明:

1,开始编译前,需要注意以下地方

a) 需要确定一个统一的安装目录,便于后续指定依赖路径。下面我自己使用的是/opt/voip/,实际请根据自己的喜好设定。

b)如果依赖库源码包压缩包是在windows环境下载,且你习惯使用Linux虚拟机进行操作,那么压缩包最好在linux环境中解压,很多文件会创建链接文件,windows环境不支持。如果在windows解压然后将目录拷贝到Linux虚拟机中,肯定会编译失败

2,编译ogg。      进入解压后的目录,运行以下命令:

./configure –host=x86_64 –prefix=/opt/voip/ –disable-shared –enable-static CC=aarch64-buildroot-linux-gnu-gcc

说明:aarch64-buildroot-linux-gnu-gcc为RK3588平台的交叉编译器,请根据自己情况修改。

disable-shared    enable-static 表示不生成动态库,生成静态库  也可根据自己的情况修改。

–host 选用x86_64 (32位环境使用arm-linux) 即可,如果使用交叉编译环境名称 aarch64-buildroot-linux-gnu,八成不会被识别,configure容易失败或报警

configure成功后,make, make install ,这个库编译过程基本不会有错误

3,编译speex。      进入解压后的目录,运行以下命令:

./configure –disable-shared –enable-static –host=x86_64 CC=aarch64-buildroot-linux-gnu-gcc AR=aarch64-buildroot-linux-gnu-ar –prefix=/opt/voip/ –with-ogg=/opt/voip/

configure成功后,make,

说明:如果某个.a库报错 error adding symbols: archive has no index

执行指令 aarch64-buildroot-linux-gnu-ar s *.a

重新 make,  make install

4,编译osip。      进入解压后的目录,运行以下命令:

./configure –disable-shared –enable-static –host=x86_64 CC=aarch64-buildroot-linux-gnu-gcc AR=aarch64-buildroot-linux-gnu-ar –prefix=/opt/voip/

说明:要和exosip保持版本统一

configure成功后,make, make install

5,编译openssl。      进入解压后的目录,运行以下命令:

./config –cross-compile-prefix=aarch64-buildroot-linux-gnu- –prefix=/opt/voip/ no-asan no-asm

说明:osip和exosip使用3.3.0版本的话,可不编译此库;另外,注意一般openssl库有个config脚本,因此配置指令不一样

如果config报错:“glob” is not exported by the File::Glob module

configure和 test/build.info这个文件需要修改,打开后,搜索File::Glob

把     use if $^O ne “VMS”, ‘File::Glob’ => qw/glob/;

改成use if $^O ne “VMS”, ‘File::Glob’ => qw/:glob/;

config成功后,make,如果报错error: unrecognized command-line option ‘-m64’

打开所有的Makefile,删除所有的-m64后,重新make, make install

6,编译exosip。      进入解压后的目录,运行以下命令:

./configure –disable-shared –enable-static –host=x86_64 CC=aarch64-buildroot-linux-gnu-gcc AR=aarch64-buildroot-linux-gnu-ar –prefix=/opt/voip/ PKG_CONFIG_PATH=/opt/voip/lib/pkgconfig PKG_CONF_LIBDIR=/opt/voip/lib/ –disable-openssl

说明:这里使用的版本可以支持 disable-openssl,推荐不适用openssl,否则上面需要交叉编译openssl,且最终需要将openssl支持库也放到工程里,增加工作量。

configure成功后,make,

如果报错/osip_port.h:93:10: fatal error: config.h: No such file or directory

原因与解决方法:

原因是2.6.19之后的内核没有了config.h文件,因此直接把对应的include注释掉即可。

或者添加头文件#include <linux/autoconf.h>

重新make , make install

6,编译linphone。     编译前需要确保安装 automake autoconf,且包装版本是1.11。如果已经安装了其他版本,删除后重新安装1.11版本。

例如:apt-get search automake,查看当前源里的包含的版本和名称。(我使用的是ubuntu,如果是CentOS或其他版本,软件管理工具不一样),如果不包含需要的版本,那么需要更换更新源,然后再安装。

安装使用 apt-get install automake=1.11

安装完成libtool 和libtool-bin

进入解压后的目录,运行以下命令:

./autogen.sh, 然后进入 ortp 和 mediastreamer,分别运行里面的autogen.sh

再执行configure指令

./configure CC=aarch64-buildroot-linux-gnu-gcc AR=aarch64-buildroot-linux-gnu-ar STRIP=aarch64-buildroot-linux-gnu-strip –prefix=/opt/voip/ –host=x86_64 –with-gnu-ld –enable-static –enable-alsa=yes –disable-glib –with-osip=/opt/voip/ –with-speex=/opt/voip/ SPEEX_CFLAGS=”-I/opt/voip/include” SPEEX_LIBS=”-L//opt/voip/lib -lspeex -lspeexdsp” OSIP_CFLAGS=”-I/opt/voip/include” OSIP_LIBS=”-L/opt/voip/lib -leXosip2 -losipparser2″ –disable-video –disable-gtk_ui PKG_CONFIG_PATH=/opt/voip/lib/pkgconfig/ READLINE_CFLAGS=”-I/opt/voip/include” READLINE_LIBS=”-L/opt/voip/lib”

configure完成后, 修改所有的Makefile及引用文件,删除所有的 -Werror 删除所有的 -lv4l1 和 -lv4l2

make,

tests最终会编译失败,但是需要的ortp和Mideaststreamer的库已经在各个src/.lib/下生成,拷贝出来即可,主要是ortp和mediastreamer的库

至此,linphone完整的依赖环境编译完成。
下面同时提出疑问,供大家参考。

1,tests编译失败,主要原因是mediastreamer的源码里有个叫oss.c的源文件,此源文件居然使用到了与平台相关的接口,为了编译通过,我特意增加了接口头文件,
于是tests程序会报 接口无法找到实现位置的错误,相编译通过,需要在Makefile中增加平台接口库文件的引用。
2,我使用的linphone压缩包是包含ortp和mediastreamer源码的压缩包,是公司前辈留下来的,但是前辈没有留下编译过程和改动点。于是我想从网上查找此版本(2.3.1)mediastreamer源码,与我使用的源码进行比对。
疑问在于我从网上看到的mediastreamer新版本的源码都没有这个oss.c文件,且目录结构差别较大,旧版本的我又无法找到源码包,时间有限,容不得我深入研究,因此只能在我已有的版本基础上继续开发了。
如果有哪个大神有linphone3.2.1集合ortp和mediastreamer的原始压缩包,或者单独mediastreamer的2.3.1的压缩包,辛苦分享一下,邮箱留下pk413@126.com

上面的过程是我踩了无数坑,做了大量尝试,以及查阅了大量资料总结的过程,我不吝啬于分享。过程看似简单,但是碰到的每个小问题都够尝试小半天的。希望广大网友也大方的分享资源,提前谢谢大家了。

目前正在研究如何使用编译后的环境进行voip通话开发,后续会更新研究过程。

敬请期待。。。

本文为原创文章,转载请注明出处!