Visual Studio 6.0編譯PWLib總結1. 我的環境
Visual Studio 6.0Visual Studio.NET 2010Microsoft Platform SDK for Windows Server 2003 R2Microsoft SDKsMicrosoft DirectX 9.0 SDKMinGW
2. 注意
嘗試編譯前,請務必閱讀 http://www.cnblogs.com/yedaoq/archive/2011/02/22/1960866.html 。本文只涉及部分我在我的編譯環境中遇到的,並且官方編譯說明中沒有包含的問題。
3. 項目變動、編譯順序
在官方文檔中,提到的編譯順序為:Console、Console Components、PWLib。但在目前最新版本(1.12)的PWLib中,已經不再包含Console Components項目。官方解釋是為了簡化Windows下庫檔案的管理,並與Unix保持一致。Console Components的所有源檔案都添加到Console工程中了。
據我觀察,installdir\PWLib\src\ptclib中的檔案應該就是原Console Components工程的內容,而installdir\PWLib\src\ptlib則是原Console工程的內容。理由是:根據官方文檔,Console Components是一個包含額外的PWLib特性的工程,這些特性依賴於特定的其它庫和SDK。由於我的機器上存在Platform SDK、DirectX SDK,這些SDK包含了對Direct Sound、IPv6等的支援,在Console的編譯過程中,需要手動將installdir\PWLib\src\ptclib中的部分檔案添加到Console工程中。這部分檔案的功能在我看來符合“特性”的定義。因而我推測原Console Components的檔案被放置在installdir\PWLib\src\ptclib目錄中。當然,這隻是猜測而已。
新版本的PWLib的編譯順序為Console、MergeSym、PWLib,MergeSym是一個新工程。官方FAQ中有關於此工程的一些陳述:PWLib和OpenH323試圖在各個版本間保持DLL進入點的序號的一致性,MergeSym程式會比較DLL中的函數簽名與.dtf檔案中列出的進入點,並確保最終的檔案以相容的序號結束。
3. Include、Lib目錄順序
PWLib包含對_CrtReportBlockType的調用,其所在標頭檔為crtdbg.h。但是VC6帶的crtdbg.h不包含該函數,而Platform SDK帶的crtdbg.h中包含。因而platform SDK目錄應在VC6目錄之前。
另外,PWLib內建了Wince和WM平台的一些標頭檔。在之前的編譯過程中,這些標頭檔有影響。因此,建議將PWLib目錄置於Include目錄的偏後位置。另外,我覺得也可嘗試移除這些標頭檔,它們在installdir\PWLib\include\ptlib\wince和installdir\PWLib\include\ptlib\wm中。
4. Console編譯問題
錯誤內容:
Microsoft Platform SDK for Windows Server 2003 R2 \sdk\include\wspiapi.h(47) : error C2265: '' : reference to a zero-sized array is illegal
解決辦法:
wspiapi.h標頭檔頭部添加語句:#define _WSPIAPI_COUNTOF
錯誤內容:
fatal error C1083: Cannot open source file: '.\podbc.cxx': No such file or directory
解決辦法:
該檔案位置不對,實際位置在installdir\PWLib\src\ptclib中。
錯誤內容:
G:\Open Source\ptlib\src\ptlib\common\videoio.cxx(567) : error C2059: syntax error : '}' G:\Open Source\ptlib\src\ptlib\common\videoio.cxx(568) : error C2143: syntax error : missing ';' before '}'
解決辦法:
sizeTable表的最後一個子結構中沒有定義內容(即使用成員預設值)。但在VC上無法編譯通過,其寫法應改為:{ NULL, 0, 0 }。
5. MergeSym編譯問題
MergeSym編譯過程中,一般會出現連結問題。有兩個解決方向:
首先,刪除.dtf檔案。之前說過,MergeSym會用.dtf檔案來保持DLL入口序號的相容性。預設的dtf檔案包含啟用了所有特性時的進入點列表,即最全的列表。如果實際上沒有啟用某些特性,則MergeSym的對比過程會失敗。官方建議刪除所有的.dtf檔案。這些檔案在installdir\PWLib\include\ptlib\msos中。
其次,當啟用了某些特性時,需要手動向Console工程中添加額外的檔案,否則會在編譯MergeSym時出連結錯誤。Console編譯過程中,configure程式會掃描所有硬碟,尋找其中的程式庫,基於此確定啟用哪些特性。以下為安裝了platform SDK和VC6時的特性載入情況:
Located DNS Resolver at f:\program files\microsoft platform sdk for windows server 2003 r2\Located IPv6 Support at f:\program files\microsoft platform sdk for windows server 2003 r2\include\Located QoS Support at f:\program files\microsoft platform sdk for windows server 2003 r2\include\Located ODBC support at f:\program files\microsoft platform sdk for windows server 2003 r2\include\Located Direct Sound Support at f:\program files\microsoft visual studio\vc98\Features: Version enabled Byte Order enabled Semaphore Support enabled Plugin Support enabled DNS Resolver enabled Cyrus SASL DISABLED Open LDAP DISABLED due to absence of feature sasl Open SSL DISABLED Open SSL AES DISABLED due to absence of feature openssl Windows Open SSL DISABLED Windows Open SSL AES DISABLED due to absence of feature winssl Expat XML DISABLED Windows Expat XML DISABLED VXML DISABLED due to absence of feature expat|winexpat Jabber DISABLED due to absence of feature expat|winexpat XMLRPC DISABLED due to absence of feature expat|winexpat SOAP DISABLED due to absence of feature expat|winexpat Speech API DISABLED IPv6 Support enabled QoS Support enabled Simple DirectMedia Layer DISABLED Video Support enabled ASN Support enabled STUN Support enabled pipe channel Support enabled DTMF encoding/decoding support enabled WAV file support enabled SOCKS protocol support enabled FTP protocol support enabled SNMP protocol support enabled Telnet protocol support enabled remote connection support enabled Serial Support enabled POP3/SMTP Support enabled HTTP Support enabled HTTP service Support enabled Config file protocol support enabled Socket aggregation support enabled Video file support enabled Sound support enabled Direct Sound Support enabled ODBC support enabled
若啟用了這些特性,則需要向Console工程添加至少下列檔案:installdir\PWLib\src\ptclib目錄中的delaychan.cxx、http.cxx、pvfiledev.cxx、pvidfile.cxx、pwavfile.cxx、pwavfiledev.cxx,以及installdir\PWLib\src\ptlib\common中的pglobalstatic.cxx。
若要阻止Configure掃描某些位置以免啟用某些特性,可以編輯環境變數:MSVC_PWLIB_CONFIGURE_EXCLUDE_DIRS或PWLIB_CONFIGURE_EXCLUDE_DIRS等。
6. PWLib編譯問題
錯誤內容:
Microsoft Visual Studio\VC98\INCLUDE\d3dtypes.h(14) : fatal error C1083: Cannot open include file: 'subwtype.h': No such file or directory
解決辦法:
添加WIN32宏的定義,可添加到dllmain.cxx中。如:#define WIN32 1
錯誤內容:
LINK : fatal error LNK1181: cannot open input file "ptclib.lib"
解決辦法:
之前提到Console Components項目合并到Console中了,因而PWLib項目也不再需要依賴ptclib.lib(Console Components的輸出)。開啟PWLib項目屬性框->Link頁->Object/Library Modules,將其中的ptclib.lib去掉即可。
錯誤內容:
fatal error LNK1202: "ptlib.pdb" is missing debugging information for referencing module
解決辦法:
將installdir\PWLib\Lib檔案夾刪除,所有工程重新編譯。