天天看點

部署VC2008應用程式

如果你編譯了一個VC2008的預設的CRT/MFC的應用程式,如果目标部署電腦上沒有安裝相應的VC2008的動态庫,當運作你的程式的時個,會出現如下錯誤資訊.

部署VC2008應用程式

這是因為程式使用了基于VC2008的CRT/MFC的動态庫版本.

解決這個問題,有三種方法:

1.使用靜态連結庫編譯(缺點,生成的exe的程式過于龐大)

2.使用vcredist_x64.exe 将VC2008的發行版的DLL安裝在你的系統上.(缺點,隻能支援發行版,調試版程式不能支援)

3.将你的程式依賴的CRT/MFC的動态庫與你的程式一起釋出(放在與你的釋出程式同一目錄中)

第一種和第二種就不詳細講如何實作了,隻要講第三種方法如何實作.優其是程式的開發是使用了VC2008 SP1的版本開發的程式.

在你的VC2008的安裝目錄下有兩個目錄,

  • C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.CRT
  • C:/Program Files (x86)/Microsoft Visual Studio 9.0/VC/redist/x86/Microsoft.VC90.MFC

隻要将這兩個目錄下的檔案一同拷貝到釋出程式的同一目錄下:

  • Microsoft.VC90.CRT.manifest
  • msvcr90.dll
  • msvcp90.dll
  • msvcm90.dll
  • Microsoft.VC90.MFC.manifest
  • mfc90.dll
  • mfc90u.dll
  • mfcm90.dll
  • mfcm90u.dll      

這些是這個程式依賴的發行版動态庫,同理,如果是調試版的釋出程式,也一樣把相應的調試動态庫拷貝到相應目錄.

程式如你意運作起來了!

但是,如果你安裝的是VC2008 SP1的版本的時候,問題就來了,你的程式也一樣運作不起來了!

原因就是安裝了VC2008 SP1的時候,它把"VC/redist"用新的版本檔案代替了,問題不大,但是,這個程式的版本是依賴于新的manifest的檔案的,當你編譯VC2008-SP1的程式的時候,它同時把RTM-version寫入程式的manifest檔案中,這個是舊的RTM-version,不與新版本的VC2008-SP1的"CRT/MFC"manifest版本一緻,是以程式運作的時候是拒絕導入這些新的VC2008-SP1的CRT/MFC的運态庫!

解決方法有兩種.

方法一:

最簡單的,修改Microsoft.VC90.CRT.manifest和Microsoft.VC90.MFC.manifest檔案,将新的版本号改為舊的版本号,如果是依賴其它的Microsoft.VC90.*.manifest的檔案,也同樣是如此修改!

如果是裝了VC2008-SP1後,它的版本号是“9.0.30729.8″

未裝VC2008-SP1前的版本号為"9.0.21022.8"

過程如下:

将所依的動态庫的及它們的 manifest 檔案拷貝到釋出應用程式的同一目錄下,并修改Microsoft.VC90.*.manifest檔案,将

version="9.0.30729.1"

修改為

version="9.0.21022.8"

恭喜你,你的程式運作起來了!



方法二

修改你的程式的所依賴的manifest,這樣程式會依整于新的manifest.

過程如下:

在stdafx.h
這個檔案中,增加如下宏定義:



#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

程式編譯後就會依賴于新的manifest,版本号為

"9.0.30729.1"



無須再修改manifest檔案中的version版本号了.

将所依的動态庫的及它們的 manifest 檔案拷貝到釋出應用程式的同一目錄下

恭喜你,程式又運作起來了!



注意:如果你是想要新的MFC-feature-pack的功能,用這種方法是最好的.



注意一點,非常重要,如果已經安裝了vcredist_*.exe程式包,注意的是Dll會自動把引用調到系統目錄下的WinSxS目錄下的,即不再引用同一目錄下的動态庫!

如果是編譯時使用了(/clr)這個編譯選項去支援.net開發,你必須要安裝.net framework redistributable包!



不過,在2010,編譯的程式會不再需要manifest檔案!






      

繼續閱讀