osip及eXosip的編譯及開發方法

osip及eXosip的編譯方法

在最新版本的osip2、exosip2中不支持在VC6.0下編譯osip、exosip協議棧的方法

說明:
1.以下文章中的osip版本爲3.1.0
2.eXosip版本爲3.1.0
3.編譯環境爲:Windows XP 專業版本+VS 2005
4.實例程序下載:http://download.csdn.net/source/617797
5.osip、exosip、openssl的開發包下載,開發包包括:osip2.dll、osipparser2.dll、exosip2.dll、libeay32.dll、ssleay32.dll和相對應的lib文件,下載地址同上

第一步,下載:
http://download.savannah.gnu.org/releases/osip/libosip2-3.1.0.tar.gz
下載最新的osip庫並解壓
http://download.savannah.gnu.org/releases/exosip/libeXosip2-3.1.0.tar.gz
下載最新的eXsoip庫並解壓
第二步,編譯osip3.1.0:
1.用VS2005打開libosip2-3.1.0/platform/vsnet/osip.sln
2.對osip2和osipparser2項目生成Release DLL
3.其生成的LIB/DLL 位於:libosip2-3.1.0/platform/vsnet/Release DLL/下
4.如果有出現外部變量找不到的情況,很有可能是生成的dll沒有實現該函數,在def文件中刪除找不到的外部變量就好了
第三步,編譯eXosip3.1.0:
1.用VS2005打開libeXosip2-3.1/platform/vsnet/eXosip.sln
2.將libosip2-3.1/include/osip2目錄COPY到libeXosip2-3.1/include/下
3.將libosip2-3.1/include/osipparser2目錄COPY到libeXosip2-3.1/include/下
4.在libeXosip2-3.1目錄下新建lib目錄
5.將“第二步”中生成的libosip2-3.1/platform/vsnet/Release DLL/osip2.lib文件COPY到libeXosip2-3.1/lib目錄下
6.將“第二步”中生成的libosip2-3.1/platform/vsnet/Release DLL/osipparser2.lib文件COPY到libeXosip2-3.1/lib目錄下
7.修改項目屬性,新增Dnsapi.lib Iphlpapi.lib Ws2_32.lib osip2.lib osipparser2.lib庫輸入
8.修改項目屬性,新增庫目錄../../lib
9.修改項目的輸出爲.DLL,默認爲.lib
10.編譯Relase DLL
11.其生成的LIB/DLL 位於:libeXosip2-3.1/platform/vsnet/Release/下

注意:

在eXoSip.def 中添加下面函數的導出,不知道是爲什麼 這些函數沒有導出!
     eXosip_call_set_reference

    eXosip_call_build_initial_invite

    eXosip_call_send_initial_invite

    eXosip_call_build_request

    eXosip_call_build_ack

    eXosip_call_send_ack

    eXosip_call_build_refer

    eXosip_call_build_info

    eXosip_call_build_options

    eXosip_call_build_update

    eXosip_call_build_notify

    eXosip_call_send_request

    eXosip_call_build_answer

    eXosip_call_send_answer

    eXosip_call_terminate

    eXosip_call_build_prack

    eXosip_call_send_prack

    eXosip_call_get_referto

    eXosip_call_find_by_replaces

編譯osip可能會出現如下錯誤:

1:在osipparser.dll的def文件會出現幾個拼寫錯誤,如缺少MD5_****的函數前面缺少osip_,使得連接器出現link2019錯誤,解決方法是在前面加上osip_

2:但是如果在編譯的時候出現錯誤:

libnet_prand.obj : error LNK2001: unresolved external symbol __imp__CryptReleaseContext@8
libnet_prand.obj : error LNK2001: unresolved external symbol __imp__CryptGenRandom@12
libnet_prand.obj : error LNK2001: unresolved external symbol __imp__CryptAcquireContextA@20
Debug/Libnet.dll : fatal error LNK1120: 3 unresolved externals

仔細看了下,CryptReleaseContext等這三個函數不是從advapi32.lib裏導入的麼?難道要加上advapi32.lib庫?在項目設置的連接裏把advapi32.lib加上,然後rebuil all,果然成功。

如果出現是__RTC_CheckEsp這個外部變量無法解析,很大可能是兩個項目的配置不一樣,比如說一個能從父項目繼承什麼。另外一個沒有設置,就會出現這個問題。

編譯eXosip可能會出現的問題:

要包含頭文件:ssleay32.lib libeay32.lib Dnsapi.lib Iphlpapi.lib Ws2_32.lib osip2.lib osipparser2.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ,其中ssleay32.lib libeay32.lib是openssl的靜態庫。

可能還會找不到一些無法解析的外部變量,可能是在osip的輸出dll的def文件中沒有加上


     osip_transaction_set_srv_record     @122

然後重新編譯osip

外部變量問題,一般都是庫文件的問題,記住要把庫文件放在工程目錄lib目錄下(沒有lib目錄自己新建一個) 然後在工具->項目->c/c++->C++目錄下把設置../../lib設置成包含的目錄

其中ssleay32.lib libeay32.lib是openssl編譯形成的靜態鏈接庫,可以從網上下載,或者自己編譯

之外,尤其大家下載的源代碼由於認爲的或者是編譯環境的不同,容易造成多種錯誤,我還碰到了個無法解析的Osip_^^^!!#@!@#!函數無法解析的情況,在osip中的def文件一查,果然缺少個122的函數文件輸出聲明,加進去重新編譯osip,成功,在編譯eXosip成功!

最後運行實例,進行項目配置:

osip及eXosip的開發方法:
將以下程序作爲UAS.CPP保存


將以下程序作爲UAC.CPP保存

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章