目录
- 目录
- 编译信息
- 说明
- 问题及现象
- 解决方法
编译信息
作者:xzf
创建时间:2022/7/7
更新时间:2022/8/8
说明
在window系统上编译sip,win10家庭版验证通过
版本说明:
- c-ares:1.16.1(版本不能太高,不然文件结构变化不能一件生成)
- libexosip2-5.3.0
- libosip2-5.3.0
编译
1.下载库源码
1.下载osip https://www.antisip.com/download/exosip2/libosip2-5.3.0.tar.gz
2.下载exosip https://www.antisip.com/download/exosip2/libexosip2-5.3.0.tar.gz
3.下载c-ares https://c-ares.haxx.se/
根据上述说明下载对应版本。
2.解压文件
将下载好的文件解压到同一目录下
--cares
--exosip
--osip
3.编译
1.打开exosip/platform/vsnet/eXosip.sln
2.选择eXosip
打开项目属性,c/c++ 预处理器 删掉 HAVE_OPENSSL_SSL_H
,(需要安装openssl,不然会报错)。
3.点击生成即可。
在eXosip.sln
同目录下的V142会生成对应平台的静态库。
4.参考
https://blog.csdn.net/qq_37120714/article/details/105849862
动态库编译
前期和编译静态库一样,但是不生成静态库。
1.加入def
直接改成生成动态库,不会生成lib和dll,只会生成dll,故需要在项目属性里加入相关的def.
具体操作:
打开osippaerser2
项目属性》配置属性》链接器》输入》模块定义文件:osipparser2.def
(具体文件路径在osip/platform/vsnet/osipparser2
,即osip.sln同目录下)。
osip2 同样操作。osip2.def
exosip2 同样操作。exosip2.def
点击生成即可。
PS:在exsip
生成《目标文件名》最好改成exsip2
,不然会生成exosip.lib
和exosip.dll
。而不是exosip2.lib
和exosip2.dll
。
2.生成报错处理
情况一
错误 LNK2001 无法解析的外部符号 eXosip_automatic_refres
错误 LNK2001 无法解析的外部符号 eXosip_enable_ipv6
错误 LNK2001 无法解析的外部符号 eXosip_refer_build_request
错误 LNK2001 无法解析的外部符号 eXosip_refer_send_request
错误 LNK2001 无法解析的外部符号eXosip_subscribe_build_initial_request
错误 LNK2001 无法解析的外部符号 eXosip_subscribe_build_refresh_request
错误 LNK2001 无法解析的外部符号eXosip_subscribe_send_initial_request
错误 LNK2001 无法解析的外部符号 eXosip_subscribe_send_refresh_request
这是由于版本的不同,5.3.0已经不适用这些函数,5.0后eXosip_subscription_build_initial_request
已经替代了eXosip_subscribe_build_initial_request
。
在exosip2.def
删掉相关函数即可。
点击重新生成即可。
情况二
错误 LNK2019 无法解析的外部符号 _DnsQueryConfig@24,函数 _eXosip_dnsutils_naptr 中引用了该符号 eXosip
加入Dnsapi.lib
库重新编译即可。
情况三
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号 _ares_create_query,
错误 LNK2019 无法解析的外部符号 _ares_strsplit_free,
错误 LNK2019 无法解析的外部符号 _ares_strsplit,
错误 LNK2019 无法解析的外部符号 _ares__getplatform,
在libcares项目加入相关缺少文件。
即(ares_create_query.c、ares_strsplit.h、ares_strsplit.c、ares_platform.h、ares_platform.c
)注意.在libcares.1.16.1版本,加入的文件是 ares_platform.h、ares_platform.c
,更早些版本是ares_getplatform.h、ares_getplatform.c
。
情况四
错误 LNK2001 无法解析的外部符号
_osip_compensatetime
_osip_getsystemtime
_osip_transaction_get_reserved1
_osip_transaction_get_reserved2
_osip_transaction_get_reserved3
_osip_transaction_get_reserved4
_osip_transaction_get_reserved5
_osip_transaction_set_naptr_record
_osip_transaction_set_reserved1
_osip_transaction_set_reserved2
_osip_transaction_set_reserved3
_osip_transaction_set_reserved4
_osip_transaction_set_reserved5
...
看到类似的基本是由于没有相关接口引出来,需要修改osip2.def
即可。
或者osipparser2.def
,以下是osipparser2.def
的
_osip_list_clone
_osip_message_replace_header
_osip_strcasestr
__osip_free
__osip_malloc
__osip_realloc
___osip_uri_escape_userinfo
...
点击重新生成即可。遇到类似的情况同理即可。
修改方式
# @数字是根据上一个数字的增加1
# 减少_,函数坑你是_或者__或者___开头,
_osip_compensatetime 对应 osip_compensatetime @数字
情况五
错误 LNK2001 无法解析的外部符号 __imp__accept@12
错误 LNK2001 无法解析的外部符号 __imp__bind@12
看到这种类似的,直接上ws2_32.lib即可。
3.调用时报错
调用某些可能会报错,这时候是因为exsip2
相关接口没有暴露出来。修改exosip.def
重新编译即可。
eXosip_malloc
eXosip_subscription_build_initial_subscribe
eXosip_subscription_send_initial_request
eXosip_call_build_initial_invite
eXosip_call_send_initial_invite
eXosip_call_terminate
eXosip_call_build_ack
eXosip_call_send_ack