前言
寫程式的人常常會寫了一些應用程式或小工具後,想把它拿到另外一台電腦上測試或是分享給親朋好友,此時若是對方的電腦沒有安裝 Visual Studio,往往會遇到一個問題:對方無法執行我們的程式!
中文版錯誤訊息:
無法啟動這個應用程式,因為應用程式的設定不正確。重新安裝應用程式應該可以修復這個問題。
英文版錯誤訊息:(我沒有英文版 Windows ,只好上網偷)
This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.
每當我遇到這種情況的時候,我都會想起研究所的學弟 DNA !當然不是想他這個人,是想起他說的話:
What The Fuck! (WTF)
這當然有一些解決方式:
- static link、
- 找出所有的 dependency ,然後包一包丟過去、
- 做個 release build ,然後找 MS 出的轉散發套件(redistributable package)請對方安裝、
- 做個安裝程式,把所有東西包一包!
解決方式
這裡就介紹最簡單的解決方式:copy!Visual C++ 的散佈套件放在:
安裝目錄\VC\redist
若是散佈 release 版本,就在這資料夾下根據平台選擇,若是 debug 版本,就選擇 Debug_NonRedist 這個子目錄,進去後一樣根據平台選擇下一個目錄。
不論是 release 版或是 debug 版,目錄都會根據函式庫類型分類好,不過 debug 似乎比 release 少了些東西:
- Microsoft.VC80.ATL
- Microsoft.VC80.MFCLOC
不確定是不是因為 debug 版沒有上面兩者或是包含在 DebugMFC 裡頭了
Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\x86 的 layout,給 debug build 用
Microsoft Visual Studio 8\VC\redist\x86 的 layout,給 release build 用
剩下要做的就是把跟你程式相關的函式庫一同 copy 給對方就可以了,不過這只解決了與 Visual C++ 相關的相依性,其他的程式用到的函式庫,就得靠自己尋找一下。
基於好奇,再往 CRT 的資料夾裡頭看一下,那麼你會發現裡頭有四個檔案:(節錄自C Run-Time Library (CRT))
- Microsoft.VC80.DebugCRT.manifest
Side-by-side assembly 不可或缺的一環,是微軟在 .Net 提出的架構,用來管理程式、元件的相依性。竟然說是不可或缺了,記得一定要 copy 這個檔案過去。 - msvcr80d.dll
Multithreaded, dynamic link (import library for MSVCR80.DLL). Be aware that if you use the Standard C++ Library, your program will need MSVCP80.DLL to run. - msvcp80d.dll
Standard C++ Library - msvcm80d.dll
C Runtime import library. Used for mixed managed/native code. 如果程式沒用到 managed code,這個就不需要!