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~

2 0
原创粉丝点击