eXosip入門(三):eXosip庫的驗證
本次我們來驗證一下得到的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測試工程裡面,上述的編譯錯誤即可解決。剩下的事情就是編譯除錯了。
題外話:其實這些錯誤對於作者來說可能只是一時疏忽,忘記引出幾個函式而已,但是對於初學者及新手來說往往造成巨大的麻煩,或者打擊學習信心。本人記得就僅僅為了處理上面的錯誤,就耗費了一個上午的時間,查閱了大量的網頁資料,才找到解決辦法。