VS2012下编译libeXosip2

VS2012下编译libeXosip2

  • 从连接https://c-ares.haxx.se/处下载c-ares
  • 全部下载解压统一放到一个文件夹下,然后修改文件夹的名字, 
    libexosip2-xxx 修改为exosip 
    libosip2-xxx 修改为osip 
    c-ares-xxx 修改为c-ares

2. 进入exosip文件夹下的目录:.\platform\vsnet 。 打开eXosip.sln后会加载相关项目

VS2012下编译libeXosip2

如果出现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”

VS2012下编译libeXosip2

在编译 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 @418 

4.对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。

    错误类型6:    unresolved external symbol __report_rangecheckfailure
     _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及以上版本进行开发;


参考文章

VS2013编译eXosip2-4.1.0