VC++ 2005編出來的程式無法在WINXP下執行,這件事情竟然困擾了我一個下午。我花了一個上午的時間將我的程式編譯完成,並且可以在我的電腦上正常運作,但是將這個程式拿給別人時,竟然出現"由於應用程式配置不正確,應用程式未能啟動,重新安裝應用程式可能可以解決這個問題"的提示對話框,我所撰寫的程式無法執行。
 
我第一個直覺動作就是換一台電腦試試看,於是從WINXP換成WIN2000上執行,結果發現WIN2000出現不同的錯誤訊息。但是這個錯誤訊息卻比較好解決,因為我看的懂。主要是說找不到一些動態連結檔,於是我把該程式需要的動態連結檔(dll)複製到WIN2000那台機器上,結果就可以執行了。於是我又將這包程式,當然包含那些動態執行檔(dll)複製到WINXP的作業系統上,結果依然不能執行,而且出現和之前一樣的錯誤。出現"由於應用程式配置不正確,應用程式未能啟動,重新安裝應用程式可能可以解決這個問題"的提示對話框。於是我又開始懷疑是不是.net framework ,於是在WINXP上安裝.NET Framework 2.0,結果仍然出現相同的錯誤。明明是相同的程式,而且都是在微軟的作業平台上執行,竟然因為作業系統的不同而不能執行。
 
最後終於知道發生什麼問題,這個問題不是因為缺少DLL所引起的,也不是因為沒有安裝.NET Framework所造成的,而是在Visual C++ 2005默認的MFC是使用動態的MFC函式庫(Use MFC in a Shared DLL)來連結,而動態MFC函式庫是Muti-threaded DLL (/MD),由於WINXP對於文件的監控比較嚴格,因此導致部分使用多執行緒的DLL執行時發生錯誤,因此會造成上述的問題。
 
解決方法:
修改編譯時的屬性設定,
在Project ->Property ->configuration Properties ->C/C++ -> Code Generation ->Runtime Libary 修改成Multi-threaded(/MT),
修改了Runtime之後,將MFC編譯類型變更成靜態函式庫,
Project ->Property ->Configuration Properties ->Use of MFC
修改成Use MFC in a Static Library
這樣部分的問題就會解決了。但是在做了上述的變更之後,似乎會產生另一個問題,似乎是函式庫衝到了。有些函式庫似乎是重複定義了,所以又要修改編譯的屬性值。
Project ->Property ->configuration Properties ->Linker -> Input ->Additional Dependenceies
加入 nafxcw.lib和l ibcpmt.lib 。
Project->Property->configuration Properties->Linker->Input->Ignore Specific Library
加入nafxcw.lib和l ibcpmt.lib 。
修改完重新編譯就能在WINXP上執行了。

CJY0503 發表在 痞客邦 留言(2) 人氣()