日期:2014-05-17  浏览次数:20905 次

在Windows下编译最新版本的Libjingle
Libjingle版本: 0.5.2
操作系统: Windows XP
编译器: Microsoft Visual C++ 2008 Express

具体可以参考README:
http://code.google.com/p/libjingle/source/browse/trunk/README

这里将根据我自己的环境以及遇到的问题进行总结.

1. 安装Python 2.4或者之后的版本. 因为swtoolkit只能工作在Python 2.x版本, 所以不能安装Python 3.x版本.
下载位置: http://www.python.org/

2. 安装scons-local 2.0.0或者之后的版本. 设置环境变量SCONS_DIR指向包含scons-local的目录, 如/src/libjingle/scons-local/scons-local-2.0.0.final.0/
注意SCONS_DIR指向的目录不是你下载的scons-local包直接解压缩后的目录 (这个目录包括scons.py, scons-README等文件), 而是里面包含的名为scons-local-x.x.x的子目录
下载位置: http://www.scons.org/download.php

3. 安装swtoolkit
下载位置: http://code.google.com/p/swtoolkit/

4. 下载expat包, 解压缩到talk/third_party/expat-2.0.1/
注意不要下载Win32安装包, 而应该是源代码包
下载位置: http://sourceforge.net/projects/expat/

5. 下载最新的srtp包, 解压缩到talk/third_party/srtp
注意不要使用srtp-1.4.4, 因为这个版本遗漏了Libjingle所使用的一些extensions
下载位置: http://sourceforge.net/projects/srtp/develop
为了省去你使用CVS下载最新srtp代码的麻烦, Libjingle已经上传了最新的srtp包, 下载位置: http://libjingle.googlecode.com/files/srtp-cvs.zip

如果你的expat和srtp包在其他位置或者名称不一样, 需要对应地修改talk/libjingle.scons

6. 进入到talk目录, 运行$path_to_swtoolkit/hammer.bat
将会进行编译, 最终将在talk/build/dbg/lib目录下生成:
expat.lib 
libjingle.lib 
libsrtp.lib 
libxmpphelp.lib
在talk/build/dbg/staging目录下生成:
call.exe
login.exe
relayserver.exe
stunserver.exe

下面是可能遇到的编译问题以及对应的解决方法.
1.
编译错误talk\session\phone\devicemanager.cc(31) : fatal error C1083: Cannot open include file: 'atlbase.h': No such file or directory
解决方法:
1) 安装Platform SDK
下载位置: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a55b6b43-e24f-4ea3-a93e-40c0ec4f68e5
2) 添加c:\Program Files\Microsoft Platform SDK\Include\atl到INCLUDE环境变量中, 在编译Libjingle的同一DOS窗口中执行set INCLUDE=c:\Program Files\Microsoft Platform SDK\Include\atl;%INCLUDE%

Refer to:
http://code.google.com/p/libjingle/issues/detail?id=89

2.
编译错误
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(91) : error C2220: warning treated as error - no 'object' file generated
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(206) : error C2011: 'sockaddr' : 'struct' type redefinition
c:\program files\microsoft sdks\windows\v6.0a\include\ws2def.h(437) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(132) : error C2011: 'fd_set' : 'struct' type redefinition
  c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(68) : see declaration of 'fd_set'
c:\program files\microsoft sdks\windows\v6.0a\include\winsock2.h(176) : error C2011: 'timeval' : 'struct' type redefinition
  c:\program files\microsoft sdks\windows\v6.0a\include\winsock.h(111) : see declaration of 'timeval'
......
解决办法:
在devicemanager.cc中#if WIN32宏开始的地方加入
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
在在devicemanager.cc中#if WIN32宏结束之前的地方加入
#include <mmsystem.h>
最后应该如下:
#if WIN32
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <atlbase.h>
#include <dbt.h>
#include <strmif.h>  // must come before ks.h
#include <ks.h>
#include <ksmedia.h>
#define INITGUID  // For PKEY_AudioEndpoint_GUID
#include <mmdeviceapi.h>
#include <functiondiscoverykeys_devpkey.h>
#include <uuids.h>
#include "talk/base/win32.h"  // ToUtf8
#include "talk/base/win32window.h"
#include <mmsystem.h>
#elif OSX


Refer to:
http://code.google.com/p/libjingle/issues/detail?id=89