2010年8月17日 星期二

使用 DXSDK 發生的 __ptr64 編譯問題

有時後編譯 DirectShow Sample 中的 BaseClasses 時會出現__ptr64相關的錯誤訊息,使用此 Project 有兩種方式,第一是直接 Include 完整的 Sample 目錄,例如 C:\DXSDK\Samples\C++\DirectShow\BaseClasses

這有點奇怪,建議將整個 BaseClasses 複製一份到自己的 Solution 底下,這樣才可以依這個 Solution 的需求做修改,但往往是不會修改到啥米啦,為了讓不同環境都可以正常建置,還是養成自己保留一份的習慣好了,以免有些人將 DXSDK 裝在 D 磁碟或其他地方導致找不到檔案。

到底為什麼會發生 __ptr64 的錯誤呢?

這是因為 __ptr64 這個定義存在 $(VSInstallDir) 裡面,$(VCInstallDir) 的位置在哪,就要參考 Visual Studio 的巨集怎麼定義了,通常是 C:\Program Files\Microsoft Visual Studio 9.0\VC\ 而另一個也常用且長得很像的巨集叫 $(VSInstallDir) 則是在 VS 的上一層 C:\Program Files\Microsoft Visual Studio 9.0\

BaseClasses 有使用到這個定義,但 DXSDK 本身卻沒有定義 __ptr64 是什麼,導致建置動作的前置處理器認不得這個識別字,而發生 Unknow Define 的狀況。

解法有二,一是將定義移到 BaseClasses 或 DXSDK 會用到的地方前面,這做法也有點怪,若有潔癖的人是不會喜歡修改 SDK 的 header 檔這種行為的,所以此解法為下下策。另一解法就是看看 IDE 工具的 include 路徑設定中,是否將 DXSDK 的順序擺在 VC 之前了,導致前置處理器跑去 DXSDK 找相關定義而沒有去 VC 資料夾找定義,只要將 VCDIR 的順序調整至 DXSDK 之前即可。

另外以 Visual Studio 為例,Tool/Setting 中的 include 資料夾設定的優先權較低,會低於各 Project 自己的 property 設定,所以可能 Setting 裡順序是 VC 在前,但 Project Property 內有參考 DXSDK 路徑,這樣也是會先去 DXSDK 的,這種狀況就要把 Project Property 內的 DXSDK 拿掉,或在前面補上 $(VCInstallDir)。

沒有留言:

張貼留言