您的位置:首页 > 其它

eXosip入门(三):eXosip库的验证

2012-09-08 01:41 417 查看
本次我们来验证一下得到的eXosip库是否可用。

PS:为什么要验证呢?不是编译成库后就可以直接使用么?理论上是这样的,但是现实是残酷滴,编译成库文件,只是噩梦的开始,学习的道路不会一帆风顺。

本次只是验证eXosip库是否可用,不需要很复杂的代码,测试代码如下:

// test.cpp
#include "stdafx.h"
#include <eXosip2/eXosip.h>
#include <stdio.h>
#include <stdlib.h>
#include <Winsock2.h>

int _tmain(int argc, _TCHAR* argv[])
{
int i;
i = eXosip_init(); // 初始化eXosip和osip协议栈
if (i != 0)
return -1;

return 0;
}

操作步骤如下:

1、在VS2008里创建win32控制台程序工程;

2、将上面的代码保存成test.cpp并加入工程中;

3、将libosip源码包的include目录下的osip2、osipparser2两个文件夹及osip2.dll、osipparser2.dll、osip2.lib、osip2.lib、osipparser2.lib拷到工程内,并在工程设置里面设置好包含路径;

4、需要在工程属性——》链接器——》附加依赖项,增加以下库文件:

eXosip.lib

osip2.lib

osipparser2.lib

Iphlpapi.lib

Dnsapi.lib

ws2_32.lib;

5、然后点击编译,你会惊奇的发现竟然会出现那么多的编译错误!Oh!My GOD!噩梦开始了!!

大致的编译错误如下:

1>eXosip.lib(eXosip.obj) : error LNK2019: 无法解析的外部符号 _osip_transaction_set_naptr_record,该符号在函数 __eXosip_transaction_init 中被引用
1>eXosip.lib(eXtl_tcp.obj) : error LNK2019: 无法解析的外部符号 _osip_realloc,该符号在函数 __tcp_tl_recv 中被引用
1>eXosip.lib(eXutils.obj) : error LNK2001: 无法解析的外部符号 _osip_realloc
1>eXosip.lib(eXtl_tcp.obj) : error LNK2019: 无法解析的外部符号 _osip_strcasestr,该符号在函数 _handle_messages 中被引用
1>eXosip.lib(jrequest.obj) : error LNK2019: 无法解析的外部符号 ___osip_uri_escape_userinfo,该符号在函数 __eXosip_dialog_add_contact 中被引用
1>eXosip.lib(jresponse.obj) : error LNK2001: 无法解析的外部符号 ___osip_uri_escape_userinfo
1>C:\Users\Cheney\Desktop\SIP\eXosipTest\Debug\eXosipTest.exe : fatal error LNK1120: 4 个无法解析的外部命令

产生这些错误是因为需要用到的一些函数在osip库在def文件中没导出。需要修改\libosip2-3.6.0\platform\vsnet目录下面的osip2.def、osipparser2.def两个文件,在文件的末尾导出这些函数,具体如下:
osip2.def:

osip_transaction_set_naptr_record @138

osipparser2.def:

osip_realloc @416

osip_strcasestr @417

__osip_uri_escape_userinfo @418

修改完毕后,重新编译整个解决方案,得到新的dll及lib,更新到eXosip测试工程里面,上述的编译错误即可解决。剩下的事情就是编译调试了。
题外话:其实这些错误对于作者来说可能只是一时疏忽,忘记引出几个函数而已,但是对于初学者及新手来说往往造成巨大的麻烦,或者打击学习信心。本人记得就仅仅为了处理上面的错误,就耗费了一个上午的时间,查阅了大量的网页资料,才找到解决办法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: