Linux及Windows下编译exosip和osip2源码

eXosip库及编译流程简介

1、eXosip库的简介

1.1、osip简介

osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高。但缺点也很明显,首先就是可用性差,没有很好的api封装,使得上层应用在调用协议栈时很破碎;其次,只做到了transaction层次的协议过程解析,缺少call、session、dialog等过程的解析,这也增加了使用的难度;再次,缺少线程并发处理的机制,使得它的处理能力有限。

1.2、eXosip简介

eXosip是osip2的一个扩展协议集,它部分封装了osip2协议栈,使得它更容易被使用。eXosip增加了call、dialog、registration、subscription等过程的解析,使得实用性更强。但是eXosip局限于UA的实现,使得它用于registrar、sip server等应用时极其不容易。另外,它并没有增加线程并发处理的机制。而且只实现了音频支持,缺少对视频和其它数据格式的支持。

2、eXosip的编译流程简介

2.1、概述

eXosip库适用于多种不同的操作系统,这里将以常见的Linux及windows操作系统为例进行编译流程的简介及注意事项。以下以eXosip的目前最新版本5.3.0、osip的5.1.2以及c-cares的1.18.1版本进行编译示例
编译eXosio库需要对osip2库及c-ares库(windows下编译需要)进行编译,以下附上所需库以下附上所需库的下载链接
eXosip下载链接:http://git.savannah.nongnu.org/cgit/exosip.git/refs/
osip2 下载链接:http://download.savannah.gnu.org/releases/osip/
c-ares下载链接:https://c-ares.haxx.se/
执行make相关配置包链接:http://mirrors.kernel.org/gnu/

2.2、linux编译

2.2.1、编译流程
1、下载osip2的5.1.2版本源码包及eXosip的最新版本5.3.0的源码包
2、将下载好的源码包拷贝到对应的编译服务器
3、分别执行tar –zxvf +源码包名称,并分别重命名为eXosip及libosip
4、设置环境变量export path=${pwd},方便后续存放库文件及头文件
5、创建空的文件夹sip,mkdir sip,方便后续存放库文件及头文件
6、先编译osip库,cd libosip/
7、执行命令 sh autogen.sh用以生成configure文件
8、执行命令./configure  --prefix=$path/sip CFLAGS="-g -O2 -pthread -fPIC -D_GNU_SOURCE" 用以生成makefile文件
9、执行成功后,执行最后一步:make && make install等待生成即可
10、osip库编译成功后会在上级目录的sip文件夹下生成对应的头文件及库文件,再来编译eXosip库,
11、eXosip库的编译流程同osip流程一致,全部执行成功即可在sip文件夹下查看对应文件


1、没有环境的系统配置需配置如下版本,其他版本可能不兼容导致执行sh autogen.sh或make时报错

automake:1.13.4
autoconf:2.69
libtool:2.4.2
m4:1.4.14

每个包进行如下安装。对于没有网络环境情况,需自行下载对应版本的包即可,链接见上

wget http://mirrors.kernel.org/gnu/automake/automake-1.11.tar.gz 
tar xzvf automake-1.11.tar.gz 
cd automake-1.11 
./configure --prefix=/usr
make
make install
cd ..

2、可借鉴编译选项

osip:./configure --prefix=$path/sip CFLAGS="-g -O2 -pthread -fPIC -D_GNU_SOURCE -fstack-protector-all -fstack-protector-strong"
exosip:./configure --prefix=$path/sip CFLAGS="-g -O2 -pthread -fPIC -D_GNU_SOURCE -DENABLE_MAIN_SOCKET -fstack-protector-all -fstack-protector-strong"  --enable-openssl=no

编译exosip时不加宏ENABLE_MAIN_SOCKET,会导致tcp主动注册时,国标设备离线

2.2.2、编译过程问题记录
2.2.2.1、编译源码时报错

1、在文件jcallback.c中找不到destroyed_time及created_time
在这里插入图片描述
解决:经过查看eXosip及osip源码发现,这两个结构体参数在osip5.1.2版本的源码中定义为completed_time及birth_time,故将此处定义修改为osip中对应的的结构体定义即可

2、找不到osip_timersub函数的声明
在这里插入图片描述
解决:经过对比eXosip4.0.0版本的源码发现,老版本的函数中并无对此函数的引用,如下图:
在这里插入图片描述
更换不同的osip版本后依然报错故将此处的osip_timersub引用暂时屏蔽处理

3、返回值“OSIP_RETRY_LIMIT”未定义
在这里插入图片描述
解决:通过比对可以发现老版本的返回值为OSIP_UNDEFINED_ERROR
在这里插入图片描述
故这里替换为老版本的宏定义的返回值后可解决此问题。
4、can’t read /sip/lib/libosipparser2.la: No such file or directory
在这里插入图片描述
解决:报错后实际查看对应的sip文件夹下是存在lib及include等文件的,但是链接时找不到,解决方法如下:清楚库文件及配置信息后重新配置生成即可
在这里插入图片描述

2.2.2.2、链接库文件时报错

1、could not read symbols: Bad value报错
在这里插入图片描述
解决:问题原因是编译eXosip库时没有加编译选项-fPIC,重新编译并且在执行configure脚本时添加编译选项CFLAGS="-g -O2 -pthread –fPIC“即可

2、undefined reference to `__isoc99_sscanf’报错
在这里插入图片描述
解决:需要在编译eXosip库时添加编译选项-D_GNU_SOURCE,重新编译并且在执行configure脚本时添加编译选项CFLAGS="-g -O2 -pthread -fPIC -D_GNU_SOURCE"即可

3、ssl相关函数报错undefined reference
在这里插入图片描述
解决:如果出现这种报错,说明在编译eXosip库时使用默认的configure生成的makefile,默认是打开openssl选项,故这里需要链接对应的openssl库文件,解决方式有如下两种:
(1)如果需要开启openssl可以在自己的工程中的Makefile中补充对应的openssl库文件及头文件即可,如下示例
在这里插入图片描述
(2)如果不需要openssl则在编译eXosip库时关闭openssl选项即可,命令如下
./configure --enable-openssl=no

4、找不到internal.h头文件
在这里插入图片描述
解决:osip库编译成功后internal.h头文件不会自动拷贝,但是在源码路径下可以查找到此文件,将源码下osip5.1.2版本的头文件参与编译会进行如下报错
在这里插入图片描述
经过比对发现,此处报错区别为,高版本将多行合并一行,并且此头文件中并无新增相关函数定义,处理方式为:暂且使用老版本的头文件,将新版本头文件新增内容进行合并即可。

2.3、windows编译

由于这里不需要使用Windows下的库文件,这里只进行编译流程及编译过程中所遇到问题和解决方法的简要概述。本地编译环境为vs2015

2.3.1、编译流程及问题

1、下载osip2的5.1.2版本源码包及eXosip的最新版本5.3.0的源码包和c-ares的1.18.1版本的源码包
2、将下载好的源码包放到新建文件夹同级别目录
3、分别解压三个源码包到各自目录下
4、重命名exosip-5.3.0为exosip、libosip2-5.1.2为osip
5、将osip文件夹拷贝到exosip的同级目录,并新建一个名为c-cares的空目录,目录结构如下图所示
在这里插入图片描述
6、复制 c-ares-1.18.1/src/lib下所有文件到 c-ares、复制 c-ares-1.18.1/src/tools 到 c-ares、复制 c-ares-1.18.1/include 到 c-ares目录结构如下图所示
在这里插入图片描述
7、将osip的sln的同级目录的两个工程文件osip2.vcxproj和osipparser2.vcxproj拷贝到exosip的sln同级目录,如图所示
在这里插入图片描述
8、进入exosip的源码工程下找到sln,并打开
9、修改编译相关选项,左上角修改为release和win32,各个工程右键打开属性->常规中:目前平台版本选择8.1、平台工具集选v140(这里是vs2015编译可以根据自己的ide进行适当选择即可)
在这里插入图片描述
10、在eXosip 和 libcares两个项目属性中选c/c++常规,在附加包含目录编辑添加新的引用目录:…\c-ares\include
在这里插入图片描述
11、在libcares项目中添加 c-ares/tools中的两个文件, 同时删除libcares项目中原有的这两个文件ares_getopt.c、ares_getopt.h
在这里插入图片描述
12、libcares.vcxproj下加入c-ares下五个文件ares_platform.h,、ares_platform.c、ares_create_query.c、ares_strsplit.c、ares_strsplit.h
在这里插入图片描述
13、在eXosip项目属性 选c/c++ 预处理器中的预处理器定义,去掉宏HAVE_OPENSSL_SSL_H,不然在编译的时候出现fatal error C1083: 无法打开包括文件: “openssl/opensslv.h”: No such file or directory
在这里插入图片描述
14、配置完成后一键重新生成,会出现在Linux下的相同代码报错,如下:
在这里插入图片描述
相同报错的解决方法同linux编译时的处理流程,除此之外
fatal error C1083: 无法打开包括文件: “nameser.h”: No such file or directory,这个报错需要将namerser.h改为ares_nameser.h即可,因为c-cares的头文件命名有所改变。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值