关于vs2008编译linphone-3.5.2

来源:互联网 发布:笑笑知乎 编辑:程序博客网 时间:2024/05/07 03:38
    网上已经有人用vs2008编译好了linphone3.3.2, 工程地址http://code.google.com/p/linphone-vs2008/,相关依赖库都配置好了,下载直接编译即可。我试着用vs2008来编译linphone3.5.2,结果麻烦一大堆。
    
1.资源下载:
linphone-3.5.2.tar.gz   http://download-mirror.savannah.gnu.org/releases/linphone/3.5.x/sources/linphone-3.5.2.tar.gz
speex-1.2rc1.tar.gz     http://www.speex.org/downloads/
osip、exosip

2.编译speex
    解压linphone-3.5.2.tar.gz,在linphone-3.5.2目录中新建codecs目录,将speex-1.2rc1.tar.gz解压至codecs目录,并更名为speex。进入linphone-3.5.2\codecs\speex\win32\VS2008,可以看到vs2008工程,打开编译libspeex、libspeexdsp两个工程即可。
3.编译oRTP
进入目录oRTP\build\win32native,打开vs工程,直接编译即可
4.编译mediastreamer
    首先编译一个无视频版本。打开mediastreamer2\build\win32-novideo中的工程,在工程属性中添加宏定义MS2_INTERNAL,remove掉文件gsm.c,并添加以下文件到工程中
bitratecontrol.c
bitratedriver.c
eventqueue.c
qualityindicator.c
audioconference.c

还需要修改以下几个地方

打开文件alldescs.h,注释以下行:
//extern MSFilterDesc ms_gsm_dec_desc;//extern MSFilterDesc ms_gsm_enc_desc;//&ms_gsm_dec_desc,//&ms_gsm_enc_desc,

现在能够编译成功了,修改两个地方,否则而后编译linphone coreapi时会有麻烦
在mediastreamer2.def中添加
ms_thread_exit

打开mseventqueue.h,在函数定义的外面加上
#ifdef __cplusplusextern "C"{#endif...#ifdef __cplusplus}#endif
5.编译osip及eXosip
这两个库我是直接从开头提到的那份代码中copy过来的,不过需要做小许修改。eXosip2需要添加几个导出接口,打开eXosip2.def,添加
      eXosip_call_get_referto      eXosip_call_find_by_replaces

PS:本来还需要导出接口eXosip_set_tls_ctx,但是从代码中发现需要打开宏HAVE_OPENSSL_SSL_H,需要引入SSL库。没有打开这个宏的时候,编译coreapi的时候需要注释掉这人函数的调用。
6.编译linephone中的coreapi
coreapi没有提供vs工程,需要自己建立dll工程,将copreapi中所有的文件导入工程,再去掉以下几个文件
linphonecore_jni.cctunnelmanager.hhtunnelmanager.ccsipwizard.ctest_ecc.ctest_lsd.c

添加宏定义
IN_LINPHONE;LINPHONE_VERSION=\"3.5.2\";LINPHONE_PLUGINS_DIR=\"plugins\"

添加头文件依赖目录
../oRTP/include;../mediastreamer2/include;../eXosip/include;../osip/include

新建一个unistd.h文件,内容如下:
/** This file is part of the Mingw32 package. * unistd.h maps (roughly) to io.h */ #ifndef _UNISTD_H #define _UNISTD_H #include <io.h> #include <process.h> #endif /* _UNISTD_H */ 
并将#include <unistd.h>,修改为#include "unistd.h"

此时编译会发现一大堆错误,主要是vc不支持在函数中间定义变量,需要错误处的定义放到函数入口处即可

直接注释掉coreapi中的sal_eXosip2.c中对的调用语句  
//eXosip_set_tls_ctx(&tlsCtx);
注释这条语言的影响暂不清楚

找到lpconfig.c中的以下行注释掉
//if (chmod(filename, S_IRUSR | S_IWUSR) == -1)//     ms_warning("unable to correct permissions on "//              "configuration file: %s",//             strerror(errno));

一个奇怪的错误信息
 error C2078: too many initializers     e:\multimedia\linphone-3.5.2\coreapi\siplogin.c     120
查看源码,很很明显SipSetup linphone_sip_login赋值个数比定义的要多,修正后如下:
SipSetup linphone_sip_login={      "SipLogin",      SIP_SETUP_CAP_LOGIN,      0,      NULL,      NULL,      sip_login_init_instance,      NULL,      NULL,      NULL,      sip_login_do_login,      NULL,      NULL,      NULL,      NULL,      NULL,      //NULL,      //NULL,      //NULL,      sip_login_do_logout,    NULL,    NULL};

修改misc.c文件
找到函数lp_spawn_command_line_sync
将第一行修改为,#if !defined(_WIN32_WCE) && !defined(_WIN32), windows不支持popene及pclose函数

导出接口函数
要新建文件coreapi.def,导出接口函数,需要什么就添加什么吧。


经过以上修改差不多应该能够编译成功了





原创粉丝点击