close
附註:本文僅屬記錄與經驗分享且在非乾淨電腦中安裝,若有遺漏或錯誤煩請指正,如有侵權請來信告知。
[expand title="發表日期:2014/09/09 最後更新:2014/09/09" alt="點選觀看詳細更新記錄"]

  • 2014/09/09, 新增文章


[/expand]


0.目錄



  1. 問題描述

  2. 解決方案

  3. 參考資料

  4. 後記







  • 需要準備的檔案:sxstrace

  • 問題發生環境:Windows 7 x64, Visual Studio 2010, VC++ with lib: opencv, SOIL







1.問題描述


Visual Studio  編譯成功,但執行時出現"此應用程式無法啟動,因為應用程式組態不正確。重新安裝應用程式可能會修正此問題"



[caption id="attachment_659" align="aligncenter" width="486"][VC++]錯誤 [VC++]這個應用程式無法啟動,因為應用程式組態不正確。請檢查資訊清單檔有無錯誤。重新安裝應用程式或許可以修復這個問題,如需詳細資訊,請參閱應用程式的事件記錄檔。[/caption]

這主要是因為dll或lib安裝的組合不正確,例如在只有安裝vc2010(vc10)中連結vc2008(vc9)編譯出來的lib/dll


雖然在編譯的時候會過(compile只是幫你的程式做動態連結,但不管檔案存不存在)


但是runtime時(此時才會真正連結)會因為沒有安裝VC9的環境而出現組態不正確


這個問題在一般程式也有機會遇到,像是遊戲或工具可能安裝不完全,或是安裝再不適合的環境中,可以試著重新安裝


而以下則針對使用Visual Studio開發程式時,會遇到的狀況來試著解決,將方法和技巧做一個記錄


這個問題出現的情況很多,本文中遇到的可能只是冰山一角,不過還是可以朝著幾個大方向去解決




  1. 安裝相依性檢查工具( Dependency Walker tool),並把缺少的dll或檔案複製到環境中 (微軟支援kb948854)

  2. 使用sxstrace(WinSxs 追蹤公用程式)來追蹤錯誤來源 --->以下會介紹

  3. 如果是vc版本的問題,可安裝 Microsoft Visual C++ 可轉散發套件 (Redistributable Package)來補足需要的檔案 (不過這個方法的可移植性比較低,因此還是希望盡可能改成正確的lib或dll版本)


 

有時候出現"應用程式無法正確啟動,請按一下[確定]關閉應用程式。"也可以用sxstrace去找是哪個dll檔出現問題


 

2.解決方案


這個問題的核心在於找到問題的dll或lib,並改正為合適的版本


但runtime時只出現應用程式組態不正確或是無法正確啟動實在讓人摸不著頭緒


因此可以藉由相依性檢查工具( Dependency Walker tool)或是sxstrace來協助偵錯


而以下介紹sxstrace的使用,因為他是Windows內建的,可以先做初步的診斷


首先開啟cmd,輸入sxstrace指令(需使用系統管理員身分執行),指令如下:



使用方式: SxsTrace [Options]
選項:
Trace -logfile:FileName [-nostop]
啟用 sxs 的追蹤。
追蹤記錄已經儲存至 FileName。
如果指定 -nostop,則不會提示停止追蹤。
Parse -logfile:FileName -outfile:ParsedFile [-filter:AppName]
翻譯原始追蹤檔成人類看得懂的格式以及儲存結果至 ParsedFile。
使用 -filter 選項,篩選輸出。
Stoptrace
如果之前未停止,則停止追蹤。
範例: SxsTrace Trace -logfile:SxsTrace.etl
SxsTrace Parse -logfile:SxsTrace.etl -outfile:SxsTrace.txt

簡單的說就是輸入 "sxstrace Trace -logfile:D:\a.log" 紅色的部份換成你的log檔名
此時會開始追蹤錯誤訊息,一直到你按enter停止



[caption id="attachment_660" align="aligncenter" width="518"][VC++]錯誤 [VC++]輸入指令開始追蹤[/caption]

而記錄的內容是二進制內容,我們無法閱讀,因此要再輸入另一行轉譯的指令:


"sxstrace Parse -logfile:D:\a.log -outfile:D:\out.txt" 紅色部分是上面記錄的log檔,藍色的部份是要輸出的檔名



[caption id="attachment_661" align="aligncenter" width="680"][VC++]輸入指令轉換追蹤結果 [VC++]輸入指令轉換追蹤結果[/caption]

接下來開啟輸出的檔案(如"D:\out.txt")試著尋找錯誤的來源,以下是我的錯誤節錄:


[expand title="=====點此觀看我的錯誤內容=====" alt="點此觀看我的錯誤內容"]

=================
開始啟用內容產生。
輸入參數:
Flags = 0
ProcessorArchitecture = Wow32
CultureFallBacks = zh-TW;zh-Hant;zh;en-US;en
ManifestPath = D:\Google Drive\研究資料夾\code\opengles\Debug\opengles.exe
AssemblyDirectory = D:\Google Drive\研究資料夾\code\opengles\Debug\
Application Config File =
-----------------
資訊: 正在分析顯示檔 D:\Google Drive\研究資料夾\code\opengles\Debug\opengles.exe。
資訊: 顯示定義識別是 (null)。
資訊: 參照: Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"
資訊: 解析參照 Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"。
資訊: 解析 ProcessorArchitecture WOW64 的參照。
資訊: 解析文化特性 Neutral 的參照。
資訊: 套用連結原則。
資訊: 找不到發行者原則。
資訊: 找不到連結原則的重新導向。
資訊: 開始組合探查。
資訊: 在 WinSxS 找不到組合。
資訊: 嘗試在 C:\Windows\assembly\GAC_32\Microsoft.VC90.DebugCRT\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.DebugCRT.DLL 探查顯示。
資訊: 找不到文件特性 Neutral 的顯示。
資訊: 結束組合探查。
資訊: 解析 ProcessorArchitecture x86 的參照。
資訊: 解析文化特性 Neutral 的參照。
資訊: 套用連結原則。
資訊: 找不到發行者原則。
資訊: 找不到連結原則的重新導向。
資訊: 開始組合探查。
資訊: 在 WinSxS 找不到組合。
資訊: 嘗試在 C:\Windows\assembly\GAC_32\Microsoft.VC90.DebugCRT\9.0.21022.8__1fc8b3b9a1e18e3b\Microsoft.VC90.DebugCRT.DLL 探查顯示。
資訊: 嘗試在 D:\Google Drive\研究資料夾\code\opengles\Debug\Microsoft.VC90.DebugCRT.DLL 探查顯示。
資訊: 嘗試在 D:\Google Drive\研究資料夾\code\opengles\Debug\Microsoft.VC90.DebugCRT.MANIFEST 探查顯示。
資訊: 嘗試在 D:\Google Drive\研究資料夾\code\opengles\Debug\Microsoft.VC90.DebugCRT\Microsoft.VC90.DebugCRT.DLL 探查顯示。
資訊: 嘗試在 D:\Google Drive\研究資料夾\code\opengles\Debug\Microsoft.VC90.DebugCRT\Microsoft.VC90.DebugCRT.MANIFEST 探查顯示。
資訊: 找不到文件特性 Neutral 的顯示。
資訊: 結束組合探查。
錯誤: 無法解析參照 Microsoft.VC90.DebugCRT,processorArchitecture="x86",publicKeyToken="1fc8b3b9a1e18e3b",type="win32",version="9.0.21022.8"。
資訊: 啟用內容產生失敗。
結束啟用內容產生。

[/expand]

 

可以發現他一直出現找不到Microsoft.VC90.DebugCRT相關的檔案


我這次的情況是從安裝Windows 8 + VC 2010 & VC 2008的電腦移植到Windows 7 + VC 2010的環境


因為其中有連結SOIL.lib,但當時是使用VC9的lib,導致重新編譯時VC會往下使用Microsoft.VC90.DebugCRT


但是我的新環境只安裝VC2010,只有VC100,所以就會出現組態不正確的訊息


在得知是使用到舊版的lib後,更換VC10版的SOIL.lib就成功執行了


 

3.參考資料



 

4.後記


這次在程式轉移的過程一直出現莫名的錯誤,不過發生過一次第二次就差不多知道是版本的問題


不過還是需要搭配著sxstrace跟經驗,一個一個lib或dll去嘗試,才終於找到問題真正的原因


(其實是我忘記有用到SOIL這個東西了~亂加搞死自己XD)


雖然上面說的很簡單,但沒找到問題之前真的有種快崩潰的感覺阿~整整找了一個下午才解決阿~

arrow
arrow
    全站熱搜

    Robarter 發表在 痞客邦 留言(0) 人氣()