网上已经有人用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,注释以下行:
-
-
-
-
-
现在能够编译成功了,修改两个地方,否则而后编译linphone coreapi时会有麻烦
在mediastreamer2.def中添加
- ms_thread_exit
打开mseventqueue.h,在函数定义的外面加上
- #ifdef __cplusplus
- extern "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.cc
- tunnelmanager.hh
- tunnelmanager.cc
- sipwizard.c
- test_ecc.c
- test_lsd.c
添加宏定义
- IN_LINPHONE;LINPHONE_VERSION=\"3.5.2\";LINPHONE_PLUGINS_DIR=\"plugins\"
添加头文件依赖目录
- ../oRTP/include;../mediastreamer2/include;../eXosip/include;../osip/include
新建一个unistd.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中对的调用语句
-
注释这条语言的影响暂不清楚
找到lpconfig.c中的以下行注释掉
-
-
-
-
一个奇怪的错误信息
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,
-
-
-
- sip_login_do_logout,
- NULL,
- NULL
- };
修改misc.c文件
找到函数lp_spawn_command_line_sync
将第一行修改为,#if !defined(_WIN32_WCE) && !defined(_WIN32), windows不支持popene及pclose函数
导出接口函数
要新建文件coreapi.def,导出接口函数,需要什么就添加什么吧。
经过以上修改差不多应该能够编译成功了
(gavinr) |