嵌入式环境中可能会用到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通话开发,后续会更新研究过程。
敬请期待。。。
本文为原创文章,转载请注明出处!