在Windows上编译PWLib
本文来自:http://www.cnblogs.com/yedaoq/archive/2011/02/22/1960866.html
原文:http://www.voxgratia.org/docs/pwlib_windows.html#download
1. 介绍
本文所介绍的在Windows上编译PWLib的过程与OpenH323站点上介绍的编译过程是类似的。本文档为MSVC6和VS.NET2003下的编译过程提供了详细的描述。
2. 前提
一. VC6,VS2003,VS2005或VC++2005 Express Edition。注意不可使用VS2003的免费版本(对不通过GUI配置编译器的支持不完善),可以使用VC++2005 Express Edition
二. PWLib源码,可从此处下载 : http://sourceforge.net/project/showfiles.php?group_id=80674
三. 一个能正确处理行结束字符的解压工具,例如WinZIP
3. 下载和安装PWLib源码
略。要强调一点,必须使用可正确处理行结束字符的解压工具(强烈推荐WinZIP),否则将在接下来的阶段中遇到问题。
4. 编译准备工作
首次编译PWLib之前,必须做一些工作。
4a. 安装GNU bison
PWLib编译中必须用到GNU bison工具。大多数情况下不需要用到GNU flex,除非你需要重新编译 “asnparser”以更改 OpenH323的ASN文件。为方便起见,我们已将这两个工具打包,而没有分开提供。
下载:http://www.voxgratia.org/bin/flexbison.zip
安装:将工具解压到“C:\”,这将创建一个包含flex.exe和bison.exe的“C:\TOOLS”文件夹,以及一个包含bison.simple和bison.hairy的“C:\TOOLS\SHARE”文件夹。
注意:不要尝试将bison安装到别的目录,虽然可以那么干,但不值当。
将目录“C:\TOOLS”添加到IDE的“Executable Directories”中:
图表 1 MSVC 6
图表 2 VS.NET
4b. 核对VC++头文件
若使用VC6以外的编译器,请忽略此步骤。
VC6自带的STL头文件有几处缺陷。这些缺陷可能导致应用程序崩溃,例如PWLib这类依赖静态全局变量的正确行为的程序。幸运的是,STL库的前任作者已经推出部分文件的新版本以纠正那些最致命的问题。
PWLib包含一个程序,它会检查机器上的VC6头文件,并在必要时更新某些文件。该程序的位置是: installdir/MSVC_UPGRADE.BAT
如果你的压缩包中不包含此文件,请从 http://www.voxgratia.org/releases/msvc6chk.zip 下载,并通过命令行命令“msvc6chk upgrade”启动msvc6chk程序。
对每一个需要更新的文件,程序都会要求您确认。如果没有适当的理当,建议您更新全部此类文件。
更多信息请参考:http://www.dinkumware.com/vc_fixes.html
5. 配置目录
将installdir\PWLIB\INCLUDE 添加到VC的 Include 目录列表
将installdir\PWLIB\LIB 添加到VC的 Executable目录列表
将installdir\PWLIB\LIB 添加到VC的 Library目录列表
6. 安装PWLib的可选包
PWLib编译时会自动检查主机上的已安装包。在开始编译之前,请从以下列表中选择所需要的并安装。
6a. OpenSSL
提供加密和验证支持,建议您使用预编译的二进制发行包,此处可下载:http://www.slproweb.com/products/Win32OpenSSL.html
6b. Expat
提供XML支持,若需要使用Voice XML(VXML)和XMPP功能的话,则此库是必要的。此处有可用的预编译的二进制文件包:http://sourceforge.net/project/showfiles.php?group_id=10127
6c. OpenLDAP
提供LDAP协议(用于ILS和其它网络服务中)支持。OpenLDAP需要安装OpenSSL。OpenLDAP的编译细节在此:http://www.voxgratia.org/docs/windows_openldap.html ,也可以使用预编译库:http://www.voxgratia.org/bin/openldap-2.1.17_bin.zip
主页: http://www.openldap.org
CVS 位置(仅包含新项目文件):http://cvs.sourceforge.net/viewcvs.py/openh323/pwlib/tools/openldap-2.1.17-win32.zip
6d. SDL
提供Windows上的快速视频渲染支持。参见主页:http://www.libsdl.org/
6e. IPV6
VS.NET已包含IPV6支持。
Win2000和WinXP下的VC6可支持IPV6,请参考:http://www.voxgratia.org/docs/windows_ipv6.html
6f. MicroSoft Speech API
提供“文本-语音转换”功能,请参考http://www.microsoft.com/speech/download/sdk51
6g. DNS resolver
在DNS MX和SRV纪录的解决方案中用到。
VS.NET已包含DNS resolver的支持。
在VC6下获得DNS resolver的最简单的方式是安装Platform SDK:http://www.microsoft.com/msdownload/platformsdk/sdkupdate/
7. 编译
有三个工程可用于编译:
名称 描述 Debug Release
Console 基础PWLib的静态库 ptlibsd.lib ptlibs.lib
PTLib 基础PWLib的动态库 ptlib.lib&ptlib.dll ptlib.lib&ptlib.dll
2006年8月份的PWLib还包含另外一个工程:
Console Components 包含额外的PWLib特性,只能为静态库 ptclibd.lib ptclib.lib
其中静态库可独立编译,动态库的编译需要先编译“MERGESYM”实用程序。该程序依赖于库的Release版本。
7a. MSVC 6
一、编译Console项目的Debug或Release版本。
提示1:若安装了Platform SDK,可能遇到以下错误:
Compiling...
assert.cxx
C:/Program Files/Microsoft SDK/include/winsock2.h(1218) : error C2061: syntax error : identifier 'DWORD_PTR'
C:/Program Files/Microsoft SDK/include/winsock2.h(1262) : error C2146: syntax error : missing ';' before identifier 'Key'
C:/Program Files/Microsoft SDK/include/winsock2.h(1262) : error C2501: 'ULONG_PTR' : missing storage-class or type specifiers
....
遇到此问题时,请将Include目录和Lib目录中的Platform SDK目录置于VC98目录之后。
提示二:
若遇到以下错误,请参考本文4b 部分。
PWLIB File Upgrader v1.0
Copyright (C) 2004 by Post Increment
WARNING: the following file requires upgrading:
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE\XTREE
Please run "msvc6chk upgrade" to upgrade this file
Error executing c:\winnt\system32\cmd.exe
提示三:
若Configurre程序找到了其它编译器目录中的参数,例如CygWin,MSys,VS2005或VS2003。请参考有关裁剪Configure搜索路径的文档:http://www.voxgratia.org/docs/faq.html#4_32
二、编译Console Components(存在的话)。
三、编译PWLib。首次编译ptlib.dll或ptlibs.dll时,会自动编译MERGESYM。这要求先编译Console和Console Components的Release版本。
7b. VS2003和VS2005
与VC6下的编译过程相同。
8. 编译ASNParser
使用PWLib 1.7/OpenH323 1.4及更新版本,或Janus补丁4时,可忽略此步骤。
其它情况下,应编译PWLib中提供的ASN Parser的Release版本,否则在编译OpenH323时将遇到问题。
9. 同时使用MSVC 6、VS2003以及VS2005
在同一系统上使用MSVC 6、VS2003和VS2005来编译PWLib的可能性是存在的。这里有两个小窍门:
一、切换到新的编译器之前,仅仅使用“Clean”操作来清除编译文件是不够的。尤其是此操作似乎并不清除“.pdb”文件,创建DLL时它将引发问题。一个可选的方式在新环境中开始编译之前,删除目录:
installdir\PWLIB\LIB directory
我更倾向于为不同的编译器使用不同的目录树,这要求每个环境都设置不同的目录。这允许更快的切换编译器,但也要求双倍的存储空间。
二、在Console项目编译之初,PWLib运行configuration的时候,每个环境都有可能会找到并使用Microsoft SDK Lib文件和Include文件的错误版本。为避免此问题,可以使用以下环境变量来阻止Configure搜索某些文件夹中的参数:
MSVC_PWLIB_CONFIGURE_EXCLUDE_DIRS D:\Program Files\Microsoft Visual Studio .NET 2003
VSNET_PWLIB_CONFIGURE_EXCLUDE_DIRS C:\Program Files\Microsoft Visual Studio
VSNET2005_PWLIB_CONFIGURE_EXCLUDE_DIRS C:\Program Files\Microsoft Visual Studio .NET 2005
请注意PWLib 1.7/OpenH323 1.14之前的版本中的configure.exe不支持这些变量。
10. 使调试器显示PWLib类型值
找到AUTOOEXP.DAT,在不同的环境中其位置为:
MSVC 6 |
C:\Program Files\Microsoft Visual Studio\Common\MSDev98\Bin\autoexp.dat |
VS.net 2003 |
C:\Program Files\Microsoft Visual Studio .NET 2003\Common7\Packages\Debugger\autoexp.dat |
Visual C++ Express |
C:\Program Files\Microsoft Visual Studio 8\Common7\Packages\Debugger\autoexp.dat |
对MSVC 6,用文本编译器打开此文件并在末尾添加以下行:
; for PTLib
PObject =<,t>
PString =<theArray,s>
PCharArray =<theArray,s>
PContainer=<,t> size=<reference->size> ref=<reference->count>
PAbstractArray =<,t> size=<reference->size> ref=<reference->count>
PArrayObjects =<,t> size=<theArray->reference->size> ref=<reference->count>
PIPSocket::Address = <v.four.S_un.S_un_b.s_b1,u>.<v.four.S_un.S_un_b.s_b2,u>.<v.four.S_un.S_un_b.s_b3,u>.<v.four.S_un.S_un_b.s_b4,u>
PTimeInterval = <milliseconds>
PTime = <theTime>
对VS.NET,将上述行添加到[hresult]段之前。
重启MSVC或VS.NET,即可在调试器中看到PWLib变量的值。
11. 在命令行中使用VS.NET
VS.NET编译器可通过命令行以非GUI的方式调用。若要如此,请使用“打开Visual Studio.NET 2003 命令提示符”快捷方式来打开命令窗口,或打开一个普通命令窗口并执行“vcvars32.bat”文件。
以下命令生成Console项目的Debug版本:
devenv /build Debug /project "Console" pwlib.sln
以下命令生成pwlib.sln解决方案中的所有项目:
devenv /build Debug pwlib.sln
12. 在Windows上如何让configure停止查找错误的头文件?
在Windows上,configure程序会搜索所有本地磁盘驱动器,查找那些指示能够启用哪些编译时选项的头文件和库文件。有时候,由于搜索了错误的目录,configure会找到一些不应该找到的文件。当本机上安装了类似CygWin或MSys之类的包时,就可能出现这种情况。
为阻止configure尝试使用这些头文件,需要扫描过程中应忽略的目录:通过将路径添加到PWLIB_CONFIGURE_EXCLUDE_DIRS环境变量。
另外,本文第9部分的所述的环境变量可用于定义针对各种编译环境的忽略目录。当机器上安装了多个环境时,这尤其有用。
请注意:版本1.5之前的configure不支持忽略整个驱动器。
在comfigure命令行上使用—exclude-dir参数也可以指定忽略目录(或包含带—exclude-env参数的目录的环境变量)。