2011年8月4日
(1) 安装intltool:访问http://ftp.acc.umu.se/pub/GNOME/binaries/win32/intltool/0.40/并下载intltool_0.40.4-1_win32.zip,解压到c:\msys目录下;
(2) 安装linphone-deps:访问http://download.savannah.gnu.org/releases- noredirect/linphone/misc/并下载linphone-deps-win32-091203.zip,解压到c:\msys目录 下;
(3) 安装gtk+:访问http://www.gtk.org/download-windows.html,下载pkg-config_0.23-3_win32.zip和glib_2.24.0-2_win32.zip,解压到c:\msys目录下;
(4) 编译libSRTP:
- 访问http://sourceforge.net/projects/srtp/并下载srtp-1.4.4.tgz,并解压到c:\msys\src目录下(也可以是其它目录);
- 运行c:\msys\msys.bat,执行以下命令,
cd /src/srtp
autoconf
./configure–prefix=/usr
make
make install
make clean
(5) 编译ortp:
- 访问http://download.savannah.gnu.org/releases-noredirect/linphone/ortp/sources/并下载ortp-0.16.3.tar.gz,解压到c:\msys\src目录下(也可以是其它目录);
- 运行c:\msys\msys.bat,执行以下命令,
cd /src/ortp-0.16.3
autoconf
./configure–prefix=/usr
make
make install
make clean
(6) 编译mediastreamer2:
- 访问http://download.savannah.gnu.org/releases-noredirect/linphone/mediastreamer/并下载mediastreamer-2.5.0.tar.gz,解压到c:\msys\src目录下(也可以是其它目录);
- 运行c:\msys\msys.bat,执行以下命令,
cd /src/mediastreamer-2.5.0
autoconf
./configure–prefix=/usr
make
make install
make clean
(7) 创建lib文件供VC++使用:运行c:\msys\msys.bat,执行以下命令,
cd /lib
cp../src/mediastream-2.5.0/build/win32native/mediastreamer2.def mediastreamer.def
cp ../src/ortp-0.16.3/build/win32native/ortp.def ortp.def
cp../bin/libortp-8.dll .
cp../bin/libmediastreamer-0.dll .
dlltool –Dlibortp-8.dll –d ortp.def –l ortp.lib
(为支持linphone media engine 需要在ortp.def文件添加如下代码:
payload_type_pcmu8000
payload_type_pcma8000
payload_type_pcm8000
payload_type_l16_mono
payload_type_l16_stereo
payload_type_lpc1016
payload_type_g729
payload_type_g7231
payload_type_g7221
payload_type_g726_40
payload_type_speex_nb
payload_type_speex_wb
payload_type_speex_uwb
payload_type_ilbc
payload_type_telephone_event
av_profile
) dlltool –Dlibmediastreamer-0.dll.a –d mediastreamer.def –l mediastreamer.lib
原帖
http://www.cnblogs.com/joiner/archive/2010/06/18/1759943.html
本节所需的程序包如未特别注明,都是从http://sourceforge.net/downloads/mingw/下载,本节下文称之为“下载站点”。
(1) 建立程序目录:在c盘建立msys目录,并在msys目录下建立mingw子目录;
(2) 安装MinGW:访问下载站点,
- 浏览MinGW->BaseSystem->GNU-Binutils->binutils-2.20.51,下载binutils-2.20.51-1-mingw32-bin.tar.lzma;
- 浏览MinGW->BaseSystem->RuntimeLibrary->MinGW-RT->mingwrt- 3.18,下载mingwrt-3.18-mingw32-dev.tar.gz和mingwrt-3.18-mingw32-dll.tar.gz;(如果在编译程序的时候,出现undefined reference to __dyn_tls_init_callback 链接错误时,可以换一个版本低一些的)
- 浏览MinGW->BaseSystem->RuntimeLibrary->Win32-API w32api-3.14,下载w32api-3.14-mingw32-dev.tar.gz;
- 浏览MinGW->BaseSystem->GCC Version4->gcc-4.5.0-1, 下载gcc-c++-4.5.0-1-mingw32-bin.tar.lzma、gcc-core-4.5.0-1-mingw32- bin.tar.lzma、libgcc-4.5.0-1-mingw32-dll-1.tar.lzma和libstdc++-4.5.0-1- mingw32-dll-6.tar.lzma;
- 浏览MinGW->mpfr->mpfr-2.4.1-1,下载libmpfr-2.4.1-1-mingw32-dll-1.tar.lzma;
- 浏览MinGW->gmp->gmp-5.0.1-1,下载libgmp-5.0.1-1-mingw32-dll-10.tar.lzma;
- 浏览MinGW->mpc->mpc-0.8.1-1,下载libmpc-0.8.1-1-mingw32-dll-2.tar.lzma;
- 浏览MinGW->pthread-w32->pthread-w32-2.8.0-3,下载pthreads-w32-2.8.0-3-mingw32-dev.tar.lzma;
- 将以上所下载的压缩包解压缩到c:\msys\mingw目录下;
(3) 安装MSYS,访问下载站点,
- 浏览MSYS->BaseSystem->msys-1.0.14-1,下载msysCORE-1.0.14-1-msys-1.0.14-bin.tar.lzma;
- 浏览MSYS->coreutils->coreutils-5.97-3,下载coreutils-5.97-3-msys-1.0.13-bin.tar.lzma和coreutils-5.97-3-msys-1.0.13-ext.tar.lzma;
- 浏览MSYS->automake-1.11.1-1,下载automake-1.11.1-1-msys-1.0.13-bin.tar.lzma;
- 浏览MSYS->autoconf->autoconf-2.65-1,下载autoconf-2.65-1-msys-1.0.13-bin.tar.lzma;
- 浏览MSYS->libtool->libtool-2.2.7a-2,下载libtool-2.2.7a-2-msys-1.0.13-bin.tar.lzma;
- 浏览MSYS->crypt->crypt-1.1_1-3,下载crypt-1.1_1-3-msys-1.0.13-bin.tar.lzma和libcrypt-1.1_1-3-msys-1.0.13-dll-0.tar.lzma;
- 浏览MSYS->perl->perl-5.6.1_2-2,下载perl-5.6.1_2-2-msys-1.0.13-bin.tar.lzma;
- 浏览MSYS->gettext->gettext-0.17-2,下载gettext-0.17-2-msys-1.0.13-bin.tar.lzma、 gettext-0.17-2-msys-1.0.13-ext.tar.lzma、gettext-0.17-2-msys-1.0.13- dev.tar.lzma和libintl-0.17-2-msys-dll-8.tar.lzma;
- 浏览MSYS->bash->bash-3.1.17-3,下载bash-3.1.17-3-msys-1.0.13-bin.tar.lzma;
- 浏览MSYS->regex->regex-1.20090805-2,下载libregex-1.20090805-2-msys-1.0.13-dll-1.tar.lzma;
- 浏览MSYSàtermcapàtermcapà0.20050421_1-2,下载libtermcap-0.20050421_1-2-msys-1.0.13-dll-0.tar.lzma;
- 浏览MSYS->sed->sed-4.2.1-2,下载sed-4.2.1-2-msys-1.0.13-bin.tar.lzma;
- 浏览MSYS->libicon->libiconv-1.13.1-2,下载libiconv-1.13.1-2-msys-1.0.13-dll-2.tar.lzma;
- 浏览MSYS->make->make-3.81-3,下载make-3.81-3-msys-1.0.13-bin.tar.lzma;
- 浏览MSYS->gawk->gawk-3.1.7-2,下载gawk-3.1.7-2-msys-1.0.13-bin.tar.lzma;
- 浏览MSYS->grep->grep-2.5.4-2,下载grep-2.5.4-2-msys-1.0.13-bin.tar.lzma;
- 浏览MSYS->diffutils->diffutils-2.8.7.20071206cvs-3,下载diffutils-2.8.7.20071206cvs-3-msys-1.0.13-bin.tar.lzma;
- 浏览MSYS->openssl->openssl-1.0.0-1,下载libopenssl-1.0.0-1-msys-1.0.13-dev.tar.lzma;
- 浏览MSYS->tar->tar-1.23-1,下载tar-1.23-1-msys-1.0.13-bin.tar.lzma;
- 浏览MSYS->m4->m4-1.4.14-1,下m4-1.4.14-1-msys-1.0.13-bin.tar.lzma;
- 将以上所下载的程序包解压到c:\msys目录下;
- 创建fstab文件:在c:\msys\etc目录下创建文件fstab,并增加如下内容,
c:/msys/mingw /mingw
测试基本环境:运行c:\msys\msys.bat,进入命令行界面执行gcc –version,确认基本环境已安装好;
源贴
http://www.cnblogs.com/joiner/archive/2010/06/18/1759941.html
最近有一个语言项目方面的调研,需要评估一下libjingle,所以研究了半个月的libjingle,现在把经验总结如下(如有不对,请不吝赐教):
1、libjingle库所带例子只支持rtpdump文件传递语音,不支持实时语音通话;
2、最新的几个版本的libjingle库去掉了GIPS voiceEngine的相关部分(可能是因为google收购了GIPS);
3、那么在windows下要支持实时语音通话,可以用linphone media engine,不过这个库是linux下的,所以迁移过来会费不少精力(不知有没有更好的方法):
要想在windows下用linphone media engine, 首先,按照README的说明添加如下代码:
Add the following lines into the libjingle.scons file.
In the "talk.Library(env, name = "libjingle",..." section, you need to add:
"HAVE_LINPHONE",
"HAVE_SPEEX",
"HAVE_ILBC",
to the "cppdefines = [".
add:
"session/phone/linphonemediaengine.cc",
to the "srcs = [ ..."
add:
"third_party/mediastreamer/include",
"third_party/ortp/include"
to the "includedirs = [ ..."
In the "talk.App(env, name = "call",..." section, you need to add:
"ortp"
"mediastreamer",
to the "libs = [".
然后,
访问http://download.savannah.gnu.org/releases-noredirect/linphone/ortp/sources/下载ortp代码,
访问http://download.savannah.gnu.org/releases-noredirect/linphone/mediastreamer/下载mediastreamer,
并复制到libjingle库的third_party中,文件夹名需与上一步添加的路径名一致。
在windows下需要dll,所以还得编译两个库的dll,方法转自:
http://www.cnblogs.com/joiner/archive/2010/06/18/1759941.html Mingw&msys的手动安装;
http://www.cnblogs.com/joiner/archive/2010/06/18/1759943.html Mingw&msys环境中编译mediastreamer2和ortp。
接着,
copy .lib文件到talk\build\dbg\lib目录,
copy .dll到talk\build\dbg\staging目录。
然后,修改libjingle库的socketaddress.cc里的一个bug,参考http://mysuperbaby.iteye.com/blog/910830
增加红色,解决域名转IP的问题:
bool SocketAddress::StringToIP(const std::string& hostname, uint32* ip) {
in_addr addr;
struct hostent *host;
if (isalpha(hostname.c_str()[0]))
{
host = gethostbyname(hostname.c_str());
if (host == NULL)
{
printf("gethostbyname error\n");
return false;
}
memcpy(&addr.s_addr, host->h_addr_list[0],host->h_length);
}
else if (inet_aton(hostname.c_str(), &addr) == 0)
{
return false;
}
*ip = NetworkToHost32(addr.s_addr);
return true;
}
按照README的方法,编译。
通过后运行call.exe,与Gtalk通话。
如果音质不好,断断续续,可以在mingw&msys下,
移除 winsnd2.c 添加winsnd3.c 重新编译ortp库。
还有就是关于receiving RTCP packet: Connection reset by peer. 参考http://mysuperbaby.iteye.com/blog/911159
这篇文章,也没有解决,不过不影响音质。
2011年4月24日
最近在找工作,把遇到的笔试、面试题记录在此,总结经验教训,为后面的笔试、面试打好基础。
闲话少叙,看题:
1、
声明以下变量(简单的就不列了,列我觉得稍微有点难度的吧)
a、指向整型的指针的指针的数组: int **p[];
b、指向数据的指针: int (*p)[];
c、参数为void,返回值为void的函数数组:void (*p[])();
2、下列代码输出什么?
int a = -5;
unsigned int b = 1;
b > a ? cout << b : cout << a ;
输出 -5 ,因为算术转化把int提升为unsigned int。
3、下列代码输出什么?
int a = 1;
int b = 2;
int c = a+++b;
cout << "a=" << a << " b=" << b << " c=" << c;
a=2 b=2 c=3;
优先级后置++ > 前置++ > + ;NC题,那个写代码的时候不会加个括号。
4、实现下列运算
1-2+3-4+5-6+7-8+9
方法1:
int sum = 0;
for (int i=1; i<10; i++) {
if (i % 2) {
sum += i;
} else {
sum -= i;
}
}
方法2:
int sum = 0;
int flag = -1;
for (int i=1; i<10; i++) {
flag *= -1;
sum += flag * i;
}
答题的时候写了两种,以为方法2的效率高,不过回来加大循环量后,发现方法1快些,两次乘法比一次求余慢。
5、memcpy是,目标内存与源内存有重叠是怎么copy?
可以从后往前拷。
未完待续
2010年8月29日
DLL(Dynamic
Linkable Library)可以看成一些可以直接拿来用的变量、函数或类的集合。在库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
对动态链接库,我们还需建立如下概念:
(1)DLL 的编制与具体的编程语言及编译器无关
只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。
(2)动态链接库随处可见
我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。由此可见DLL对我们来说其实并不陌生。
(3)VC动态链接库的分类
Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC动态库)、MFC Regular DLL(MFC规则DLL)、MFC Extension DLL(MFC扩展DLL)。
非MFC动态库不采用MFC类库结构,其导出函数为标准的C接口,能被非MFC或MFC编写的应用程序所调用;MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;MFC扩展DLL采用MFC的动态链接版本创建,它只能被用MFC类库所编写的应用程序所调用。
一. Non-MFC DLL的编写步骤:
1、新建项目->
win32项目->应用程序设置->应用程序类型:
选择DLL,完成。
2、添加变量、函数或类到库中,例如:
/* 文件名:xxx.h */
#ifndef XXX_H
#define XXX_H
#ifndef LIB_EXPORTS
#define
LIB_API __declspec(dllimport)
#else
#define LIB_API __declspec(dllexport)
#endif
extern "C" int LIB_API max(int x, int y);
#endif
/* 文件名:xxx.cpp */
#include "xxx.h"
int add(int x, int y)
{
return x > y ? x y;
}
在动态库的工程属性->C/C++->预处理器->预处理器定义里,添LIB_EXPORTS。 编译。
3. 创建另外一个工程,来调用该库
调用DLL有两种方式:
(1) 显式调用
typedef int (*pDllFunc)(int , int);
HINSTANCE hDll =
LoadLibrary(_T("xxx.dll"));
pDllFunc pMax = NULL;
if (hDll) {
pMax = (pDllFunc)GetProcAddress(hDll, "max");
if (pMax) {
std::cout <<
pMax(21, 22) << std::endl;
}
}
if (hDll) {
FreeLibrary(hDll);
}
(2) 隐式调用
首先,包含该库的头文件
其次,链接动态库,把保存库的目录添加到工程属性->连接器->常规->附加库目录,在工程属性->连接器->输入->附加依赖项添加库的lib文件名 或者在程序中用
#pragma comment(lib, ".\\lib\\xxx.lib")添加(若已经添加库的目录,就不需要相当路径,直接写lib文件名“xxx.lib”)
然后就可以直接用变量,函数或者类了。
注意:隐式调用和显示调用的区别:
隐式调用的方法比较方便,但DLL改变后,应用程序须从新编译。并且,所有所调用的DLL在应用程序加载的同时被加载到内存中,当应用程序调用的DLL比较多时,装入的过程十分慢。显式调用则比较灵活,但比较麻烦.
二 MFC Regular DLL 的编写步骤:
1、新建项目->MFC DLL->应用程序设置->选择DLL类型,完成。
注意:静态链接MFC DLL和共享MFC DLL的区别:静态链接把程序中要用的在MFC DLL里的东西全部编译到创建的DLL中,体积会大一点,但可以在没有装MFC的机器上运行;通过共享创建的DLL体积小,但在没有安装MFC的机器上有可能不能运行,因为没有相应的库。
2、其他步骤和创建Non-MFC
DLL差不多。
三
MFC扩展DLL
这里有比较详细的介绍http://tech.163.com/06/0316/10/2CB2S3HP0009159F.html。
2010年7月21日
MFC应用程序中,要改变控件的背景色可通过重载OnCtlColor()函数来实现。方法是在该函数中设置所需颜色后再返回一个画刷句柄便可
重绘控件背景色。OnCtlColor()函数对于控件背景色的处理是通过捕捉相应的控件消息来实现的。
常用的此类消息有:
CTLCOLOR_DLG 对话框
CTLCOLOR_EDIT 编辑框
CTLCOLOR_LISTBOX 列表框
CTLCOLOR_MSGBOX 消息框
CTLCOLOR_SCROLLBAR 滑动条
CTLCOLOR_STATIC 静态文本框、矩形等。
主要有三步:
1. 声明消息响应函数
//{{AFX_MSG(CMyDialog)
afx_msg HBRUSH OnCtlColor(CDC*
pDC, CWnd* pWnd, UINT nCtlColor);
……
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
2. 实现消息响应函数
以编辑框举例:
HBRUSH CMyDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
CtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor == CTLCOLOR_EDIT && pWnd->GetDlgCtrlID() == IDC_EDIT1)
{
pDC->SetTextColor(RGB(0,0,255));
pDC->SetBkColor(RGB(255,0,0));//设置文本背景色
pDC->SetBkMode(TRANSPARENT);//设置背景透明
hbr = ::CreateSolidBrush(RGB(255,0,0));
}
return hbr;
}
3. 添加消息映射
BEGIN_MESSAGE_MAP(
CMyDialog, CDialog)
ON_WM_CTLCOLOR()
END_MESSAGE_MAP()
注意:此方法不适用于按纽控件。
2010年7月19日
vc6下拉列表的高度有三种方法更改:
1. 在.RC界面先点击下拉按钮,然后拖动虚框,虚框即是下拉列表的大小;
2. 在.rc文件里直接修改combobox的高度;
3. 创建完combobox后,调用movewindow修改。
vs2005和vc6略有不同:
vc6的三种方法都可以使用,只不过设置的高度小于显示30个item的高度时,会默认高度为30个item的高度。
2010年7月14日
公司的产品有两个版本,一个用vs2005编译,一个用vc6编译。
新增了个功能,用vs2005编译后没问题,用vc6编译的就不好使。我的机器上没有装vc6,所以装vc6调试。
装完后编译出现以下问题:
NOTE: WINVER has been defined as 0x0500 or greater which enables
Windows NT 5.0 and Windows 98 features. When these headers were released,
Windows NT 5.0 beta 1 and Windows 98 beta 2.1 were the current versions.
For this release when WINVER is defined as 0x0500 or greater, you can only
build beta or test applications. To build a retail application,
set WINVER to 0x0400 or visit http://www.microsoft.com/msdn/sdk
to see if retail Windows NT 5.0 or Windows 98 headers are available.
See the SDK release notes for more information.
一番google,原来是SDK没有更新。
然后更新SDK,给vc6打补丁。
然后继续编译,出现头文件找不到。添加环境变量,解决之。
新添加的环境变量只对新建的进程有效,所以必须重启vc6才好使。