How to Deploy my Visual C++ Applications, Part 1

前言

寫程式的人常常會寫了一些應用程式或小工具後,想把它拿到另外一台電腦上測試或是分享給親朋好友,此時若是對方的電腦沒有安裝 Visual Studio,往往會遇到一個問題:對方無法執行我們的程式!

中文版錯誤訊息:ScreenHunter_02 Apr. 25 20.41

無法啟動這個應用程式,因為應用程式的設定不正確。重新安裝應用程式應該可以修復這個問題。

英文版錯誤訊息:(我沒有英文版 Windows ,只好上網偷

ScreenHunter_01 Apr. 25 22.11

This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.

每當我遇到這種情況的時候,我都會想起研究所的學弟 DNA !當然不是想他這個人,是想起他說的話:

What The Fuck! (WTF)

這當然有一些解決方式:

  1. static link、
  2. 找出所有的 dependency ,然後包一包丟過去、
  3. 做個 release build ,然後找 MS 出的轉散發套件(redistributable package)請對方安裝、
  4. 做個安裝程式,把所有東西包一包!

解決方式

這裡就介紹最簡單的解決方式:copy!Visual C++ 的散佈套件放在:

安裝目錄\VC\redist

若是散佈 release 版本,就在這資料夾下根據平台選擇,若是 debug 版本,就選擇 Debug_NonRedist 這個子目錄,進去後一樣根據平台選擇下一個目錄。

image

不論是 release 版或是 debug 版,目錄都會根據函式庫類型分類好,不過 debug 似乎比 release 少了些東西:

  • Microsoft.VC80.ATL
  • Microsoft.VC80.MFCLOC

不確定是不是因為 debug 版沒有上面兩者或是包含在 DebugMFC 裡頭了

ScreenHunter_03 Apr. 25 22.27 Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\x86 的 layout,給 debug build 用

ScreenHunter_04 Apr. 25 22.27Microsoft Visual Studio 8\VC\redist\x86 的 layout,給 release build 用

剩下要做的就是把跟你程式相關的函式庫一同 copy 給對方就可以了,不過這只解決了與 Visual C++ 相關的相依性,其他的程式用到的函式庫,就得靠自己尋找一下。

基於好奇,再往 CRT 的資料夾裡頭看一下,那麼你會發現裡頭有四個檔案:(節錄自C Run-Time Library (CRT)

  1. Microsoft.VC80.DebugCRT.manifest
    Side-by-side assembly 不可或缺的一環,是微軟在 .Net 提出的架構,用來管理程式、元件的相依性。竟然說是不可或缺了,記得一定要 copy 這個檔案過去。
  2. 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.
  3. msvcp80d.dll
    Standard C++ Library
  4. msvcm80d.dll
    C Runtime import library. Used for mixed managed/native code. 如果程式沒用到 managed code,這個就不需要!

image

 

Reference

  1. MSDN: How to: Deploy using XCopy
  2. This application has failed to start because the application configuration is incorrect
  3. MSDN: C Run-Time Library (CRT)

5 則留言:

87showmin 提到...

不知道你有沒有發現,release所用的x86目錄下,有個目錄名稱拼錯了。

Micorosft.VC80.DebugOpenMP

為什麼我會發現呢?因為我複製這個目錄名稱打到google上,google問我是不是要找

Micorsoft.VC80.DebugOpenMP

XDD

Keiko 提到...

沒發現 XD Good Job!

Zhong-Ho Chen 提到...

我也是這樣弄的, 不過每次都要找檔案
後來就直接跟人講: 你去灌個VC吧 XD
後來又發現有這個東西 Redistributable Package

D. N. A. 提到...

記得可以用

%VC_dir%\Common7\Tools\Bin\depends.exe

它可以抓出這個程式用到了哪些dll

這樣就不用整個目錄一起copy了~~

Unknown 提到...

有沒有windows 7 rc灌vc runtime會BSoD的八卦?XD

MiniFilter InstanceSetupCallback is not called?

一般來說,MiniFilter 的 InstanceSetupCallback 會在 filter manager 把 minifilter attache 到 volume 後呼叫。如果沒有的話,可以檢查一下 minifilter 的 INF 是否把 instance fla...