1. 程式人生 > >Visual Studio 2010下編譯osip及eXosip並搭建開發環境的方法

Visual Studio 2010下編譯osip及eXosip並搭建開發環境的方法

第一步,下載:
到http://download.savannah.gnu.org/releases/osip/libosip2-3.6.0.tar.gz下載最新的osip庫並解壓。

到http://download.savannah.gnu.org/releases/exosip/libeXosip2-3.6.0.tar.gz下載最新的eXsoip庫並解壓。

第二步,編譯osip2:
1.用VS2010開啟libosip2-3.6.0/platform/vsnet/osip.sln
2.對osip2和osipparser2專案分別編譯生成Debug DLL

第三步,編譯eXosip2:
1. 將剛剛生成的,位於libosip2-3.6.0/platform/vsnet/Debug DLL/下的osip2.lib,osip2.dll,osipparser2.lib,osipparser2.dll檔案拷貝到 libeXosip2-3.6.0\libeXosip2-3.6.0\platform\vsnet\Debug目錄下 
2. 用VS2010開啟libeXosip2-3.6.0\platform\vsnet\eXosip.sln         
3. 我們暫時用不到openSSL,所以 工程名-->右擊-->屬性-->配置屬性-->C/C++-->前處理器-->前處理器定義裡面的HAVE_OPENSSL_SSL_H巨集去掉
4. 在工程名-->右擊-->屬性-->配置屬性-->C/C++ --> 常規 --> 附加包含目錄: 將osip的標頭檔案libosip2-3.6.0\include包含進來 
5. 編譯,生成eXosip.lib

至此,在libeXosip2-3.6.0\platform\vsnet\Debug下生成osip2.lib,osip2.dll,osipparser2.lib,osipparser2.dll,eXosip.lib 5個檔案

第四步,新建SIP通訊專案 
1. 工程名-->右擊-->屬性-->配置屬性-->連結器 --> 輸入 --> 附加依賴項:增加靜態庫引用:Dnsapi.lib;Iphlpapi.lib;Ws2_32.lib;osip2.lib;osipparser2.lib;exosip.lib; 
2. 工程名-->右擊-->屬性-->配置屬性-->C/C++ -->常規 -->附加包含目錄: 將osip和eXosip的標頭檔案libosip2-3.6.0\include,libeXosip2-3.6.0\include包含進來
3. 工程名-->右擊-->屬性-->配置屬性-->連結器 --> 常規  --> 附加庫目錄:將osip和eXosip的庫包含進來,libeXosip2-3.6.0\platform\vsnet\Debug, libosip2-3.6.0\platform\vsnet\Debug
4. 將之前編譯完成的osip2.lib,osip2.dll,osipparser2.lib,osipparser2.dll,eXosip.lib 5個eXosip庫檔案放到專案下面的Debug目錄下即可。

在專案編譯過程中有可能會出現error LNK2019 無法解析的外部符號的錯誤,如下圖所示。
產生這些錯誤是因為需要用到的一些函式在osip庫在def檔案中沒匯出。需要修改\libosip2-3.6.0\platform\vsnet目錄下面的osip2.def、osipparser2.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
儲存,關閉。回到第二步重新執行即可。


至此,eXosip開發的環境已經搭建完成,下面可以直接編碼執行。將eXosip開發手冊上的例子放在下面以供參考。

[cpp] view plaincopyprint?在CODE上檢視程式碼片派生到我的程式碼片
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <WinSock2.h>
  4. #include <ws2tcpip.h>   
  5. #include <eXosip2/eXosip.h>
  6. #include <string.h>
  7. #define   BUFFSIZE   1024   
  8. #define   DEST_CALL    "sip:172.16.2.13"  
  9. #define   SOURCE_CALL  "sip:172.16.5.30:5060"
  10. #define   DEST_PORT   5061 
  11. //傳送subscribe資料包
  12. int SendSubscribe()  
  13. {  
  14.     eXosip_event_t *je;  
  15.     int i = 0;  
  16.     osip_message_t *subscribe;  
  17.     char tmp[BUFFSIZE];  
  18.     //初始化
  19.     i = eXosip_init();  
  20.     if (i != 0)  
  21.     {  
  22.         printf("Can not initialize eXosip!\n");  
  23.         return -1;  
  24.     }  
  25.     else
  26.     {  
  27.         printf("eXosip_init successfully!\n");  
  28.     }  
  29.     //繫結埠
  30.     i = eXosip_listen_addr(IPPROTO_UDP, NULL, 5061, AF_INET, 0);  
  31.     if (i != 0)  
  32.     {  
  33.         eXosip_quit();  
  34.         printf("eXosip_listen_addr failed!\n");  
  35.     }  
  36.     else
  37.     {  
  38.         printf("eXosip_listen_addr sucess\n");  
  39.     }  
  40.     //subscribe,發起呼叫請求
  41.     i=eXosip_subscribe_build_initial_request(&subscribe, DEST_CALL, SOURCE_CALL, NULL, "SE-INFO", 3600);  
  42.     if(i != 0)  
  43.     {  
  44.         fprintf(stderr, "Initial INVITE failed!, %s\n", strerror(errno));  
  45.     }  
  46.     else
  47.     {  
  48.         printf("Initial INVITE sucess!\n");  
  49.     }  
  50.     snprintf (tmp, 1024,  
  51.                 "GET:FirmwareVer\r\n"//話機的版本
  52.                 "GET:MacAddress\r\n"//話機的MAC地址
  53.                 "GET:ConfigVer\r\n"//配置檔案的版本
  54.                 //"SET:Telnet ip=192.168.3.108 port=5060\r\n"
  55.                 //"SET:Reboot\r\n"
  56.                 );  
  57.     osip_message_set_body(subscribe,tmp,strlen(tmp));  
  58.     osip_message_set_content_type(subscribe,"application/SEM-TEXT");  
  59.     eXosip_lock();  
  60.     i=eXosip_subscribe_send_initial_request(subscribe);   
  61.     eXosip_unlock();  
  62.     while (1)  
  63.     {  
  64.         je = eXosip_event_wait (0, 200);    
  65.         if (je == NULL)    
  66.         {    
  67.             continue;  
  68.         }  
  69.         else
  70.         {  
  71.             switch(je->type)   //可能會到來的事件型別
  72.             {  
  73.                 case EXOSIP_SUBSCRIPTION_ANSWERED:   //announce a 200ok
  74.                     printf("收到200 OK!!\n");  
  75.                     break;  
  76.                 case EXOSIP_SUBSCRIPTION_NOTIFY: //announce new NOTIFY 
  77.                     {  
  78.                         printf("收到EXOSIP_SUBSCRIPTION_NOTIFY!\n");  
  79.                         osip_body_t *body;  
  80.                         osip_message_get_body (je->request, 0, &body);  
  81.                         printf("%s\n", body->body);  
  82.                     }  
  83.                     break;  
  84.                 case EXOSIP_SUBSCRIPTION_REQUESTFAILURE:   // announce a request failure
  85.                     printf("EXOSIP_SUBSCRIPTION_REQUESTFAILURE!\n");  
  86.                     break;  
  87.                 case EXOSIP_CALL_ANSWERED: //收到200 OK,表示請求已經被成功接受,使用者應答
  88.                     printf("收到200 OK!\n");  
  89.                     //int call_id=je->cid;
  90.                     //int dialog_id=je->did;
  91.                     printf("call_id is %d,dialog_id is %d, je_status is %s, %s\n",je->cid,je->did, je->ss_status, je->ss_reason);  
  92.                     //回送ack應答訊息
  93.                     //eXosip_call_build_ack(je->did,&ack);
  94.                     //eXosip_call_send_ack(je->did,ack);
  95.                     break;  
  96.                 case EXOSIP_SUBSCRIPTION_PROCEEDING:  
  97.                     {  
  98.                         printf("EXOSIP_SUBSCRIPTION_PROCEEDING!\n");  
  99.                         break;  
  100.                     }  
  101.                 case EXOSIP_SUBSCRIPTION_REDIRECTED:  
  102.                     {  
  103.                         printf("EXOSIP_SUBSCRIPTION_REDIRECTED!\n");  
  104.                         break;  
  105.                     }  
  106.                 case EXOSIP_SUBSCRIPTION_SERVERFAILURE:  
  107.                     {  
  108.                         printf("EXOSIP_SUBSCRIPTION_SERVERFAILURE!\n");  
  109.                         printf("call_id is %d,dialog_id is %d, je_status is %s, %s\n",je->cid,je->did, je->ss_status, je->ss_reason);  
  110.                         break;  
  111.                     }  
  112.                 case EXOSIP_SUBSCRIPTION_GLOBALFAILURE:  
  113.                     {  
  114.                         printf("EXOSIP_SUBSCRIPTION_GLOBALFAILURE!\n");  
  115.                         break;  
  116.                     }  
  117.                 case EXOSIP_IN_SUBSCRIPTION_NEW:  
  118.                     {  
  119.                         printf("EXOSIP_IN_SUBSCRIPTION_NEW!\n");  
  120.                         break;  
  121.                     }  
  122.                 default//收到其他應答
  123.                     printf("other response!\n");  
  124.                     if (je->textinfo[0]!='/0')  
  125.                     {  
  126.                         printf( "(%i %i %i %i) %s", je->cid, je->sid, je->nid, je->did, je->textinfo);  
  127.                     }  
  128.                     break;  
  129.                 }  
  130.         }  
  131.     }  
  132.         eXosip_event_free(je); //Free ressource in an eXosip event
  133. }