1. 程式人生 > >eXosip入門(三):eXosip庫的驗證

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測試工程裡面,上述的編譯錯誤即可解決。剩下的事情就是編譯除錯了。

    題外話:其實這些錯誤對於作者來說可能只是一時疏忽,忘記引出幾個函式而已,但是對於初學者及新手來說往往造成巨大的麻煩,或者打擊學習信心。本人記得就僅僅為了處理上面的錯誤,就耗費了一個上午的時間,查閱了大量的網頁資料,才找到解決辦法。