VS2008下编译linphone3.5.2
来源:互联网 发布:网络交友有哪些弊端 编辑:程序博客网 时间:2024/06/05 20:34
断断续续花了一周的时间,总算把linphone在windows上编译成功了,在网上找了很久都没找到一个完整的文档,特意将编译过程记录下来,有需要的可以参考一下,大家共同学习。
1、准备工作:首先从linphone官网下载源码:linphone-3.5.2.tar.gz,然后下载相关的代码库,如:libosip2-3.3.0.tar.gz、libeXosip2-3.3.0.tar.gz、gtk+-bundle_2.24.10-20120208_win32.zip、linphone-deps-win32-120218.zip、speex-1.2rc1.tar.gz。
编译环境:VS2008
说明一下:linphone-3.5.2.tar.gz主要包括:linphone接口层代码、oRTP、mediastreamer2及使用gtk做的界面;
libosip2-3.3.0.tar.gz主要包括osip、osipparser2两个库;
libeXosip2-3.3.0.tar.gz主要包括eXosip2库;
gtk+-bundle_2.24.10-20120208_win32.zip主要包括gtk编译环境,由于linphone界面使用gtk做的界面,在windows上需搭建gtk环境才可以使用。
linphone-deps-win32-120218.zip包括了linphone运行所需的库文件及配置文件,编译过程中缺少的文件可直接从其中拷贝。
speex-1.2rc1.tar.gz编译mediastreamer需要。
2、编译osip、osipparser2、eXosip,由于下载下来的只有源码文件,在VS中需自己手动新建osip、osipparser2、eXosip工程,我参考的是:http://blog.csdn.net/s2dongman/article/details/4298641,按照此文档中的方法可编译生成对应的lib、dll文件,值得注意的地方是需手动添加def文件,在def文件中添加需要导出的接口函数。
3、编译oRTP和mediastreamer2,解压linphone-3.5.2.tar.gz,这两个已经有对应的vs工程,我参考的是:http://blog.csdn.net/gavinr/article/details/7335719。在编译mediastreamer2时,编译过程中提示缺的头文件和lib文件可以从linphone-deps-win32-120218.zip。
4、新建phonecore工程,我创建的是win32 控制台dll工程,将coreapi文件夹中的文件添加进去,值得注意的地方是需手动添加def文件,将用到的接口函数均添加进去,我参考的是:http://blog.csdn.net/gavinr/article/details/7335719,按照此文档编译生成,编译过程中会提示“未声明的标示符”或“将此类型用作表达式非法”等错误,只需将定义放在函数头即可。
5、编译gtk,这个是最耗时间的工程,由于之前没有接触过gtk,中间走了不少弯路。o(╯□╰)o,言归正传,首先是在VS中添加gtk环境,我参考的是:http://blog.csdn.net/fym0121/article/details/7778053,按照此文档中的方法可在VS中生成一个简易的gtk窗口即表示gtk环境安装成功。接下来就是创建gtk工程,将linphone-3.5.2\gtk下的.c及.h文件都添加到工程中,由于使用的是C++编译器,我直接将.c文件改为.cpp,需要修改的地方主要包括:
(1)将.ui脚本中用到的函数默认找的是C函数,但由于使用的C++编译器,需按如下添加说明(由于用到的函数很多,这里只帖出部分代码):
extern "C"
{
G_MODULE_EXPORT void linphone_gtk_answer_clicked(GtkWidget *button);
G_MODULE_EXPORT void linphone_gtk_decline_clicked(GtkWidget *button);
G_MODULE_EXPORT void linphone_gtk_options_activate(GtkWidget *item);
G_MODULE_EXPORT void linphone_gtk_enable_video(GtkWidget *w);
G_MODULE_EXPORT void linphone_gtk_enable_self_view(GtkWidget *w);
G_MODULE_EXPORT void linphone_gtk_show_about();
G_MODULE_EXPORT void linphone_gtk_link_to_website(GtkWidget *item);
G_MODULE_EXPORT void linphone_gtk_display_wizard();
G_MODULE_EXPORT void linphone_gtk_uri_bar_activate(GtkWidget *w);
G_MODULE_EXPORT void linphone_gtk_terminate_call(GtkWidget *button);
G_MODULE_EXPORT void linphone_gtk_about_response(GtkDialog *dialog, gint id);
G_MODULE_EXPORT void linphone_gtk_password_ok(GtkWidget *w);
G_MODULE_EXPORT void linphone_gtk_password_cancel(GtkWidget *w);
}
(2)将
static GOptionEntry linphone_options[]={
{
.long_name="verbose",
.short_name= '\0',
.arg=G_OPTION_ARG_NONE,
.arg_data= (gpointer)&verbose,
.description=N_("log to stdout some debug information while running.")
},
{
.long_name = "logfile",
.short_name = 'l',
.arg = G_OPTION_ARG_STRING,
.arg_data = &linphone_logfile,
.description = N_("path to a file to write logs into.")
},
{
.long_name="iconified",
.short_name= '\0',
.arg=G_OPTION_ARG_NONE,
.arg_data= (gpointer)&iconified,
.description=N_("Start only in the system tray, do not show the main interface.")
},
{
.long_name = "call",
.short_name = 'c',
.arg = G_OPTION_ARG_STRING,
.arg_data = &addr_to_call,
.description = N_("address to call right now")
},
{
.long_name = "auto-answer",
.short_name = 'a',
.arg = G_OPTION_ARG_NONE,
.arg_data = (gpointer) & auto_answer,
.description = N_("if set automatically answer incoming calls")
},
{
.long_name = "workdir",
.short_name = '\0',
.arg = G_OPTION_ARG_STRING,
.arg_data = (gpointer) & workingdir,
.description = N_("Specifiy a working directory (should be the base of the installation, eg: c:\\Program Files\\Linphone)")
},
{0}
};
改为:
static GOptionEntry linphone_options[]={
{
"verbose",
'\0',
0,
G_OPTION_ARG_NONE,
(gpointer)&verbose,
N_("log to stdout some debug information while running."),
N_("")
},
{
"logfile",
'l',
0,
G_OPTION_ARG_STRING,
&linphone_logfile,
N_("path to a file to write logs into."),
N_("")
},
{
"iconified",
'\0',
0,
G_OPTION_ARG_NONE,
(gpointer)&iconified,
N_("Start only in the system tray, do not show the main interface."),
N_("")
},
{
"call",
'c',
0,
G_OPTION_ARG_STRING,
&addr_to_call,
N_("address to call right now"),
N_("")
},
{
"auto-answer",
'a',
0,
G_OPTION_ARG_NONE,
(gpointer) & auto_answer,
N_("if set automatically answer incoming calls"),
N_("")
},
{
"workdir",
'\0',
0,
G_OPTION_ARG_STRING,
(gpointer) & workingdir,
N_("Specifiy a working directory (should be the base of the installation, eg: c:\\Program Files\\Linphone)"),
N_("")
},
{0}
};
至此大功告成,O(∩_∩)O哈哈~
有些修改的地方可能遗漏说明了,我把编译好的代码和相关资料都已上传,有需要的朋友可以下载看看,接下来的任务就是开始学习代码了,Fighting~
- VS2008下编译linphone3.5.2
- Fedora17环境无视频编译linphone3.5.2
- Ubuntu12下linphone3.7.0的Linux端编译
- linphone3.9windows编译心得
- vs2013+linphone3.7.0编译(win7系统)
- VS2008下编译BOOST
- pwlib VS2008下编译
- VS2008下编译boost_1_47_0
- vs2008下编译boost_1_47_0
- VS2008下LibTorrent编译
- VS2008 下编译 live555
- VS2008下编译boost
- vs2008下 openssl 编译
- VS2008下,编译.asm
- VS2008下编译Boost::asio
- VS2008下编译ACE+TAO
- Win7下VS2008编译metis
- Win7下VS2008编译Tulip
- 变形课
- 视频聊天室如何成功赚钱分享攻略二
- 视频:《博物馆3》猴子闹罗宾哭 大表哥客串
- 递归算法
- if 语句会出现的问题
- VS2008下编译linphone3.5.2
- Object C 继承
- 深入理解 retain,copy,mutableCopy
- 在 Eclipse 下利用 gradle 构建系统
- 判断日期在所在年中的位置
- ElasticSearch模块threadpool
- HTML中设置td的字体颜色
- wince系统中自绘button响应WM_LBUTTONUP和WM_LBUTTONDOWN两个消息
- openfilediaolog