執行 VC++ 專案時彈出「應用程式無法正常初始化 (0xc0150002)」,調試輸出顯示 LDR: LdrpWalkImportDescriptor() failed to probe ... libpng.dll ... ntstatus 0xc0150002。此錯誤經典成因是DLL 依賴的 CRT 版本與執行環境不匹配。本文提供完整診斷流程與三種解決方案。
0xc0150002 代表 STATUS_DLL_NOT_FOUND 或 Side-by-Side 組件載入失敗。調試輸出明確指出 libpng.dll 為問題模組。使用 Dependency Walker 或 Visual Studio 模組視窗檢視該 DLL 匯入表,發現其依賴:
Microsoft.VC90.DebugCRT, version="9.0.21022.8"
關鍵資訊:
問題核心:發布版專案卻連結了 Debug 版 CRT,且目標機器未安裝對應版本的 Debug CRT 組件。Debug CRT 不支援 Side-by-Side 共享,需完全版本匹配才能載入。
libpng 原始碼。Runtime Library 設為 /MD (多執行緒 DLL) 或 /MT (靜態連結)。libpng.dll,替換原檔案。優點:消除版本依賴,效能最佳,部署最簡單(若靜態連結 CRT 則零依賴)。
VC\redist\Debug_NonRedist\x86 (或 x64) 資料夾。Microsoft.VC90.DebugCRT 資料夾複製到目標機 C:\Windows\WinSxS 或應用程式同目錄下的 Microsoft.VC90.DebugCRT 子目錄。缺點:Debug CRT 禁止再散佈,僅限開發/測試環境使用,嚴禁用於生產環境部署。
協專案工具鏈至 VC9,與 DLL 建置環境一致。維護成本極高,不建議採用。
/MD 或全 /MT)。DebugCRT 即阻擋。遇到 0xc0150002 錯誤時,第一時間檢查故障模組的 CRT 依賴版本,90% 情況下即可定位問題。