VC編寫的程式不能在其他機器上執行的解決方案

2021-08-21 12:42:27 字數 2442 閱讀 6701

有的時候,你在visual c++上面經過好幾個月的辛勤努力,終於將程式編寫完成並且測試完畢,然而當你試圖在客戶的發布機上執行剛寫好的程式時,有可能會碰到類似下面的錯誤,作業系統告訴你「由於應用程式配置不正確,應用程式未能啟動。重新安裝應用程式可能會糾正這個問題」:

一般情況下,這個問題都是由於程式不能找到所需要的c執行庫(crt)而引起的。

在windows xp sp2以後,windows引入了side-by-side執行的概念,這個概念本來是.net提出來的,但是windows後來將這個概念整合到作業系統層面上來了。大家都應該知道dll hell的問題,為了解決dll hell的問題,side-by-side提出不同版本的dll檔案可以同時存在於同乙個系統裡面,而且依賴於不同版本dll的應用程式在執行的時候可以使用到它當初被編譯生成的dll。前面的話,有點繞,舉個例子:

1.         假定你編寫了乙個c++程式a,是使用mfc 8.0(這個版本是隨著visual studio 2005)發布的。

2.         之後你的機器公升級了visual studio的版本,從2005公升級到2008,2008的mfc庫是9.0版本的,這個時候你的作業系統裡面安裝了兩個版本的mfc,分別是8.0和9.0。

3.         你在visual studio 2008編寫了另外乙個c++程式b,b依賴與mfc 9.0。

4.         如果你執行程式a的話,作業系統會將mfc 8.0載入到a的程序裡面。

5.         如果你這時同時執行程式b,作業系統會將mfc 9.0載入到b的程序裡面。這就是side-by-side的執行概念。

作業系統之所以能夠這樣做,是因為它在引導程式a和b之前,除了檢視pe格式裡面a和b所依賴的dll資訊,都會檢視a和b的manifest檔案。manifest檔案儲存了windows可執行檔案(包括exe和dll檔案)要執行起來的環境設定資訊,檔名一般是可執行檔案的檔案全名加上.manifest。例如notepad.exe的manifest檔案就應該是notepad.exe.manifest。例外有的程式將manifest檔案直接嵌入到可執行檔案的資源裡面了,這也就是為什麼有的時候你看不到程式的manifest檔案的原因。通常來說,乙個manifest檔案的內容如下(test.exe.manifest檔案):

<?xml  version='1.0' encoding='utf-8' standalone='yes'?>

processorarchitecture='x86' publickeytoken='1fc8b3b9a1e18e3b' />

上面的例子裡面,就說明這個程式依賴於crt 9.0,而且是除錯版的,cpu架構是32位的cpu。對於將manifest檔案嵌入到資源檔案的程式我們也有辦法看到manifest的資訊。

1.         一種是使用mt.exe(visual studio自帶的manifest處理程式):

知道了程式依賴於具體哪乙個dll以後,你可以將所依賴的dll拷貝到程式的安裝資料夾裡面,以crt庫繫結失敗為例,介紹解決步驟:

1.         從上例中我們知道程式依賴的microsoft.vc90.debugcrt庫,版本號是9.0.21022.8,需要32位機器版本的crt。這個依賴項一般是因為你的程式是除錯版,所以visual studio在編譯的時候,將除錯版的crt加入程式的依賴項。

2.         從visual studio的安裝資料夾裡面將d:"program files"microsoft visual studio 9.0"vc"redist"debug_nonredist"x86中的microsoft.vc90.debugcrt整個資料夾拷貝到應用程式所在的資料夾裡面,注意:

a)         如果你的程式依賴的是32位的crt,則要拷貝x86資料夾裡面的microsoft.vc90.debugcrt資料夾,如果是先x64程式,則要拷貝x64資料夾裡面。

b)         你需要確定microsoft.vc90.debugcrt資料夾裡面的microsoft.vc90.debugcrt.manifest檔案裡面儲存的版本資訊而你程式依賴的版本資訊匹配,microsoft.vc90.debugcrt.manifest裡面的版本資訊大版本號一定要一致,小版本號一定要等於或者大於你程式依賴的crt的小版本號。比如上例中,我們的程式是依賴於crt 9.0.21022.8,而我們的microsoft.vc90.debugcrt.manifest的版本是9.0.30729.1,這樣是可以的;而8.0.30729.1就會有問題。如果大版本號一樣,小版本號不一致的話,乙個比較簡單的方案就是修改程式的manifest檔案,使其互相匹配就可以了。

VC編寫的程式不能在其他機器上執行的解決方案

有的時候,你在 visual c 上面經過好幾個月的辛勤努力,終於將程式編寫完成並且測試完畢,然而當你試圖在客戶的發布機上執行剛寫好的程式時,有可能會碰到類似下面的錯誤,作業系統告訴你 由於應用程式配置不正確,應用程式未能啟動。重新安裝應用程式可能會糾正這個問題 一般情況下,這個問題都是由於程式不能...

vs2013編譯的程式在其他機器上執行的環境設定

vs2013編譯的程式在其他沒有安裝vs2013的機器上執行會有問題,網上有很多解決方法,如果你還沒有解決,可以嘗試以下方法,這是我在反覆崩潰,煩躁測試後得到的解決方法。1.安裝vs2013 執行包 vcredist x64.exe 如果這個時候還是不能正常執行,請不要和我一樣崩潰,試試我的解決方法...

關於 C 中 程式在其他裝置上執行 的思考

原來一直頭疼於用 c 11 標準編寫的程式在僅裝有 dev 的電腦上無法執行,因而思考如何讓自己的程式在別人的裝置上執行。進過資料的查詢以及自身的實踐,總結出了以下方法 將除錯的 dubug 改為 release,然後執行程式。結束之後在該項目的資料夾中存在乙個資料夾 release,複製出其中的 ...