在Windows上编译PWLib

在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参数的目录的环境变量)。

posted @ 2011-02-22 09:38  泉子  阅读(3334)  评论(7编辑  收藏  举报