1、代码下载
http://www.antisip.com/download/exosip2/
libeXosip2-4.1.0.tar.gz
libosip2-4.1.0.tar.gz
http://c-ares.haxx.se/
c-ares-1.11.0.tar.gz
2、将压缩包解压缩后,代码放在同一个目录。
也就是libosip2-4.1.0、libeXosip2-4.1.0、c-ares-1.11.0是同级别的目录。
比如:
src
libosip2-4.1.0
libeXosip2-4.1.0
c-ares-1.11.0
将目录改名成下面的形式
libosip2-4.1.0->osip
libeXosip2-4.1.0->eXosip
c-ares-1.11.0->c-ares
新目录结构如下:
src
osip
eXosip
c-ares
3、打开解决方案
libosip2-4.1.0等默认的几个工程是VS2012的工程。
使用VS2013打开eXosip\platform\vsnet\eXosip.sln解决方案后,
会弹出[升级VC++编译器和库]的窗口。点击确定后,工程会自动升级到VS2013。
4、编译
由于eXosip依赖于libcares、osip2、osipparser2这3个库。所以直接编译eXosip即可。
5、修改编译错误
Win7系统可能会出现如下编译警告:
osip\include\osipparser2/internal.h(71): warning C4067: 预处理器指令后有意外标记 - 应输入换行符
osip\include\osip2/internal.h(163): warning C4067: 预处理器指令后有意外标记 - 应输入换行符
修改如下:
osip/include/osip2/internal.h和osip/include/osipparser2/internal.h
add start和add end中间部分为添加代码
#if (_MSC_VER >= 1700) && !defined(_USING_V110_SDK71_)
#include
// add start 增加WINAPI_FAMILY_ONE_PARTITION定义
/* Macro to determine if only one partition is enabled from a set */
#define WINAPI_FAMILY_ONE_PARTITION(PartitionSet, Partition) ((WINAPI_FAMILY & PartitionSet) == Partition)
// add end
#endif
exosip\src\eXtransport.h(44): fatal error C1083: 无法打开包括文件: “openssl/opensslv.h”: No such file or directory
配置属性->C/C++->预处理器->预处理器定义,删除HAVE_OPENSSL_SSL_H。Debug配置和Release配置都要删除。
..\..\..\exosip\src\eXtl_udp.c(55): fatal error C1083: 无法打开包括文件: “tsc_socket_api.h”: No such file or directory
配置属性->C/C++->预处理器->预处理器定义,删除TSC_SUPPORT。Debug配置和Release配置都要删除。
6、修改编译警告、错误后继续编译
Debug版本编译会生成如下文件:
eXosip\platform\vsnet\v120\Win32\Debug\
eXosip.lib
libcares.lib
osip2.lib
osipparser2.lib
Release版本编译会生成如下文件:
eXosip\platform\vsnet\v120\Win32\Release
eXosip.lib
libcares.lib
osip2.lib
osipparser2.lib
7、测试程序的编译和错误修改
测试程序代码可以参考下面博客:
http://www.cnblogs.com/qq1269122125/tag/eXosip2/
这个博客使用的是linux,如果在Windows下写代码,需要自己修改一下,把linux的头文件去掉,加入Windows的头文件。
比如
//#include
//#include
//#include
#include
测试工程建立,代码写好后,注意头文件的目录要在[附加包含目录]中设置,
链接器[附加依赖项]的设置:ws2_32.lib;Dnsapi.lib;osip2.lib;osipparser2.lib;libcares.lib;eXosip.lib;
[附加库目录]也需要根据实际情况设置。
以上内容设置完成后,开始编译,我在编译过程中遇到了如下错误:
错误类型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:无法解析的外部符号_DnsQueryConfig@24,该符号在函数_eXosip_dnsutils_naptr中被引用。
解决方法:
如果附加依赖项没有Dnsapi.lib,则会有该警告,添加Dnsapi.lib后即可消除。
DnsQueryConfig是WindowsAPI。可以查msdn。