VS2012下编译libeXosip2
- 从http://www.antisip.com/download/exosip2/ 页面下下载libeXosip2 和libosip2这两个压缩文件。(我下载的libexosip2-5.0.0.tar.gz中有缺失一个eXrefer_api.c文件的问题)
- 从连接https://c-ares.haxx.se/处下载c-ares
- 全部下载解压统一放到一个文件夹下,然后修改文件夹的名字,
libexosip2-xxx 修改为exosip
libosip2-xxx 修改为osip
c-ares-xxx 修改为c-ares
2. 进入exosip文件夹下的目录:.\platform\vsnet 。 打开eXosip.sln后会加载相关项目
如果出现osip2,osipparser2项目不能加载进来,请查看vsnet下的eXosip.vcxproj文件中相应项目的文件夹位置是否和这里的对应。这也是为什么上面第一步中把那些解压后的都放在一个文件夹下。
libcares.vcxproj下加入三个文件ares_platform.h,ares_platform.c,ares_create_query.c选项,否则在调用生成库时会出现
error LNK2019:无法解析的外部符号_ares_getplatform,该符号在函数_get_DNS_Registry中被引用。
error LNK2019:无法解析的外部符号_ares_create_query,该符号在函数_ares_query中被引用。
3. 去掉一些预定义(HAVE_OPENSSL_SSL_H,TSL_SUPPORT),不然在编译的时候出现
error C1083: 无法打开包括文件: “openssl/opensslv.h”: No such file or directory
IntelliSense: 无法打开 源 文件 “tsc_socket_api.h”
IntelliSense: 未定义标识符 “tsc_config”
在编译 libexosip2-5.0.0.tar.gz 这个版本时出现一个缺失文件的问题,后来发现时这个版本中就是缺失了“eXrefer_api.c”这个文件,而在其配置文件中添加了这个文件,导致找不到这个文件。后来在前面的版本中找到了这个文件加进去后就没问题了。
4.更改libosip2-3.6.0\platform\vsnet\osip2.def 文件
文件末尾追加
osip_transaction_set_naptr_record @138
5.更改libosip2-3.6.0\platform\vsnet\osipparser2.def 文件
在文件末尾追加 osip_realloc @416 osip_strcasestr @417
__osip_uri_escape_userinfo @4184.对eXosip进行编译。成功编译!
在项目中使用
1.项目中添加哪些库文件
Dnsapi.lib;Iphlpapi.lib;ws2_32.lib;eXosip.lib;osip2.lib;osipparser2.lib;Qwave.lib;libcares.lib;delayimp.lib;
不然可能有各种连接错误!
缺少delayimp.lib会出现
error LNK2001: 无法解析的外部符号 ___HrLoadAllImportsForDll
以上内容设置完成后,开始编译,我在编译过程中遇到了如下错误:
错误类型1: eXosip2-4.1版本中,eXosip_init、eXosip_listen_addr等函数
需要一个struct eXosip_t *excontext的参数,定义一个这个类型的变量,当作函数参数即可。 需要修改的函数较多,不一一列举,参照编译错误修改即可。
错误类型2: LIBCMTD.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount 已经在 MSVCRTD.lib(MSVCR120D.dll) 中定义
这样类似的错误有一大堆,
解决方法: 配置属性->C/C++->代码生成->运行库->多线程调试 DLL (/MDd) 改为 多线程调试 (/MTd)
错误类型3: error LNK2019:无法解析的外部符号_ares_getplatform,该符号在函数_get_DNS_Registry中被引用。
解决方法: 把ares_platform.h和ares_platform.c加入libcares工程,重新编译libcares。
错误类型4: error LNK2019:无法解析的外部符号_ares_create_query,该符号在函数_ares_query中被引用。
解决方法: 把ares_create_query.c加入libcares工程,重新编译libcares。
错误类型5:
error LNK2019:无法解析的外部符号[email protected],该符号在函数_eXosip_dnsutils_naptr中被引用。
解决方法:
如果附加依赖项没有Dnsapi.lib,则会有该警告,添加Dnsapi.lib后即可消除。
DnsQueryConfig是WindowsAPI。可以查msdn。
_report_rangecheckfailure 是用来检查堆栈缓存溢出的,如果编译的时候打开GS(project property--》Configuration properties--》c/c++--》Code generation--》Buffer security check)选项时(GS编译选项解析),编译器将为你加入检测函数堆栈缓存溢出错误额外代码。具体实现在window下的运行时库文件msvcrt.dll中。而这些检查堆栈缓存溢出的代码中在msvcrt11.dll及以后版本中都会调用到__report_rangecheckfailure 函数,所以当你用vs2010及以前版本进行开发,并使用了由vs2012及以后编译器编译的库文件时,在链接的时候就会报这样的错误。
解决办法:
一、用当前vs重新编译库文件;
二、编译库文件的时候关闭GS选项;
三、使用vs2012及以上版本进行开发;