1. 程式人生 > >疑難雜症又一記

疑難雜症又一記

本文簡述了一種 OGRE 示例程式 SampleBrowser 執行出錯的解決方法

下了 OGRE 的 1.10.11 版本,使用 CMake 生成了相應的工程檔案,遂而編譯原始碼和示例,一切都挺順利,但是當嘗試 Debug 模式下執行 SampleBrowser 時卻報了錯: Unable to read zip file …

在這裡插入圖片描述

簡單google了一下,大部分的說法都是配置的資源路徑有問題,嘗試修改了一下,未能解決問題,於是索性除錯原始碼了.

不過除錯的結果有些奇怪,錯誤似乎發生在依賴庫 zzip 中,出錯的 API 呼叫是這個:

在這裡插入圖片描述

簡單跟了一下 zzip 的內部程式碼,發現出錯點好像是發生在執行時庫中,這讓人覺得困惑.

後來嘗試 Release 模式運行了一下 SampleBrowser ,沒想竟然成功了!遂而比較了一下差異,最後發現是執行時庫的衝突導致了這個問題,簡而言之, zzip 是靜態連結入程式中的,其使用的是 多執行緒DLL(/MD) 執行時庫,而程式本身使用的是 多執行緒除錯DLL(/MDd) 執行時庫(Debug模式下),執行時庫的衝突導致了諸如 fstat 等標準庫函式的執行異常,繼而導致了上述的加載出錯問題.

解決方法也簡單, Debug 模式下連結 zzip 的除錯庫即可(下載生成的 OGRE 工程中即帶有 zzip 專案).

現在終於可以在 Debug 模式下正確執行 SampleBrowser 了~

在這裡插入圖片描述

這裡有一個相關的討論.