部署VC2008應用程式

pamxy發表於2013-03-19

轉自:http://blog.csdn.net/laiboy/article/details/5038165


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

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

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

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

2.使用vcredist_x86.exe / 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檔案!

相關文章