![](/img/trans.png)
[英]Why does MSVS 2010 MFC project depend on vcredist_x86.exe for MSVS 2008?
[英]Why installing vcredist_x86.exe doesn't fix SideBySide error when I develop an EXE on one machine and run it on another one?
問題
我在Windows XP Professional版本2002 Service Pack 3上使用Microsoft Visual Studio 2005 Verison 8.0.50727.762(SP.050727-7600)編寫了一個名為'Foo'的C ++項目。我將項目構建到Foo.exe中。 然后,我將文件Foo.exe復制到Windows Server 2003企業版Service Pack 2.當我嘗試運行它時,它失敗並出現此錯誤,
C:\foo.exe
The application has failed to start because the application configuration is incorrect.
Reinstalling the application may fix the problem.
在事件查看器>系統中,記錄了三個事件。
事件ID:32; 資料來源:SideBySide
Dependent Assembly Microsoft.VC80.CRT could not be found and Last Error was
The referenced assembly is not installed on your system.
事件ID:59; 資料來源:SideBySide
Resolve Partial Assembly failed for Microsoft.VC80.CRT.
Reference error message: The referenced assembly is not installed on your system.
事件ID:59; 資料來源:SideBySide
Generate Activation Context failed for C:\foo\Foo.exe.
Reference error message: The referenced assembly is not installed on your system.
安裝Microsoft Visual C ++ 2005 Redistributable沒有修復它
C:\\windows\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd
的文件夾。 從“添加或刪除程序”中找到的該軟件版本為“8.0.50727.42”。
在嘗試運行C:\\ foo \\ foo.exe時,我得到了與上述相同的錯誤。
安裝Microsoft Visual C ++ 2005 SP1 Redistributable沒有修復它
C:\\windows\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
的文件夾。 從“添加或刪除程序”中找到的該軟件版本為“8.0.56336”。
在嘗試運行C:\\ foo \\ foo.exe時,我得到了與上述相同的錯誤。
從同一台機器(我正在運行EXE)復制CRT DLL和清單並沒有解決它。
msvcm80.dll
, msvcp80.dll
和msvcr80.dll
從C:\\WINDOWS\\WinSxS\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd
到C:\\foo
。 C:\\WINDOWS\\WinSxS\\Manifests\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.42_x-ww_0de06acd.manifest
到C:\\foo
並將其重命名為Microsoft.VC80.CRT.manifest
。 清單文件的第四行看起來像這樣:
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.42"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
當我這次嘗試運行C:\\ foo \\ foo.exe時,它無效。 我再次使用C:\\windows\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
和相應的清單文件重復此操作。 它沒有幫助。 我得到了同樣的錯誤。
在這兩種情況下,我在事件查看器>系統中收到以下錯誤。
事件ID:34; 資料來源:SideBySide
Component identity found in manifest does not match the identity of the component requested
事件ID:58; 資料來源:SideBySide
Syntax error in manifest or policy file "C:\foo\Microsoft.VC80.CRT.MANIFEST" on line 4.
事件ID:59; 資料來源:SideBySide
Generate Activation Context failed for C:\foo\Foo.exe. Reference error message: The manifest file contains one or more syntax errors.
從Windows XP機器(我構建EXE)復制CRT DLL和清單並沒有解決它。
C:\\winnt\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700
的msvcm80.dll
, msvcp80.dll
和msvcr80.dll
復制到C:\\foo
Windows Server 2003的C:\\foo
(我試圖運行foo.exe)。 C:\\winnt\\winsxs\\Manifests\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700.manifest
到C:\\foo
並將其重命名為Microsoft.VC80.CRT.manifest
。 清單文件的第四行看起來像這樣:
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.762"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
在嘗試運行C:\\ foo \\ foo.exe時,我遇到了上一節中提到的相同錯誤。
從Visual Studio文件夾復制CRT DLL和清單修復它。
C:\\Program Files\\Microsoft Visual Studio 8\\VC\\redist\\x86\\Microsoft.VC80.CRT
復制msvcm80.dll
, msvcp80.dll
, msvcr80.dll
和Microsoft.VC80.CRT.manifest
(我在哪里開發並構建了foo.exe)到Windows Server 2003機器的C:\\foo
(我試圖運行它)。 清單文件的第四行看起來像這樣:
<assemblyIdentity type="win32" name="Microsoft.VC80.CRT" version="8.0.50727.6195"
processorArchitecture="x86"
publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
這次我可以運行C:\\ foo \\ foo.exe而沒有任何問題。
題
我期待安裝第二種方法中描述的'Microsoft Visual C ++ 2005 SP1 Redistributable'(vcredist_x86.exe)可以解決它。 但事實並非如此。 從開發計算機的C:\\Program Files\\Microsoft Visual Studio 8\\VC\\redist\\x86\\Microsoft.VC80.CRT
文件夾中復制DLL和清單文件修復了它。 為什么會這樣?
構建選項
如果它,它可以幫助您回答我的問題。 這是我從Visual Studio項目屬性中選擇的編譯器和鏈接器選項:
配置屬性> C / C ++>命令行:
/O2 /GL /D "_MBCS" /FD /EHsc /MD /Fo"Release\\\\" /Fd"Release\\vc80.pdb" /W3 /nologo /c /Wp64 /Zi /TP /errorReport:prompt
配置屬性>鏈接器>命令行:
/OUT:"C:\\MixedBag\\Release\\Foo.exe" /NOLOGO /MANIFEST /MANIFESTFILE:"Release\\Foo.exe.intermediate.manifest" /DEBUG /PDB:"c:\\MixedBag\\release\\Foo.pdb" /OPT:REF /OPT:ICF /LTCG /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
我會回答我自己的問題。 Hans Passant和Luke對這個問題的評論有所幫助。
我下載了Microsoft Visual C ++ 2005 Service Pack 1 Redistributable Package MFC安全更新並將其安裝在我嘗試運行C:\\foo\\foo.exe
。 此后EXE運行良好。
安裝程序將CRT DLL放在C:\\windows\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.6195_x-ww_44262b86
。 所以,是的,8.0.50727.6195是我正在尋找的CRT DLL的版本,正如Hans Passant正確地說的那樣。
計算此版本的最簡單方法是在開發系統上構建項目時查看Visual Studio生成的清單文件。 我的位於C:\\Foo\\Release\\Foo.exe.intermediate.manifest
。 它有這樣的標簽:
<assemblyIdentity type='win32' name='Microsoft.VC80.CRT' version='8.0.50727.6195'
processorArchitecture='x86'
publicKeyToken='1fc8b3b9a1e18e3b' />
所以,這是一個線索,我需要8.0.50727.6195版本的DLL。 剩下的就是搜索正確的vcredist_x86.exe,它恰好出現在我在第二段中提到的URL中。 該URL中的頁面包含指向KB2538242的鏈接,該鏈接顯示安裝程序將安裝的DLL的版本號。
注意:正如Elie在對此問題的不同答案中提到的,由於這是一個32位應用程序,因此必須在應該運行此應用程序的系統上安裝vcredist_x86.exe(而不是vcredist_x64.exe),而不管該系統是32位Windows系統還是64位Windows系統。 同樣,.manifest文件在processorArchitecture
屬性中提供了這個線索。
您必須安裝“Microsoft Visual C ++ 2005 Service Pack 1可再發行組件包MFC安全更新 ”,其中包括: http : //www.microsoft.com/en-us/download/details.aspx?id = 26347
以下是解決此問題的方法:
你仍然會得到的sidebyside錯誤如果正在使用的應用程序是32位,並嘗試在其上安裝了一個VC_REDISTx64 64位操作系統上運行它。
簡單的解決方案,您還必須在64位操作系統上加載VC_REDISTx86
我有一個相關的問題。 安裝了VS2005的兩台開發XP機器,稱它們為A和B.我開發,構建並運行A.然后我將整個項目復制到B.在那里。 試圖運行並得到SusamPal提到的相同錯誤消息。 我意識到在B的WinSxS上有x86_Microsoft.VC80.CRT_xxx清單(和文件夾),但沒有相應的x86_Microsoft.VC80.DebugCRT_xxx清單(以及為什么?!)。 我嘗試了SusamPal描述的幾個舞蹈和咒語無濟於事。 我通過將適當的文件夾從A的WinSxS復制到B以及WinSxs \\ Manifests中的相應清單來解決了這個問題。
雖然我的申請是
在Win 2K8 R2 x64的使用VS2008 開發 (其中有msvcm90.dll,msvcp90.dll和MSVCR90.DLL在C:\\ Program Files文件(x86)的\\微軟的Visual Studio 9.0 \\ VC \\ REDIST \\ AMD64 \\ Microsoft.VC90.CRT)
跑在Win 2K3 SP2 64位,
但是需要msvcm80.dll,msvcp80.dll和msvcr80.dll。
安裝Microsoft Visual C ++ 2005 SP1可再發行組件包(x86)后 ,可以正確安裝和運行該應用程序。
對我來說,並排錯誤只是通過設置c / c ++ - > CodeGeneration-> RuntimeLibrary,使其成為MTD即多線程調試
我們在這里確實存在以下問題:應用程序可執行文件使用清單機制引用dll。 在過去的應用程序中,作者只需將所需的dll復制到系統目錄中。 不幸的是,當通過不兼容的新版本覆蓋舊的DLL版本時,這會導致所謂的“dll hell”問題,這會導致應用程序停止工作。 然后,MS想出了版本化的想法(winsxs)。
不幸的是,這是非常復雜的機器,嘗試手動將dll(程序集)安裝到sxs文件夾中絕對不是一個好主意。 安裝所謂的“可再發行軟件包”也不是一個完美的解決方案。
另外,當我們想要調試版本時,這無濟於事。 由於MS禁止分發支持dll的調試版本,“可再發行軟件包”不會安裝它們。 (請注意,程序集ID取決於VS2005的當前subversion,並且與已安裝的支持庫有關。)
通常,VS安裝程序會將所需的程序集添加到系統中,但在一段時間后安裝更新或更新的SDK和工具可能會損壞此正確狀態。
假設我們遇到這種情況 - 我們的調試庫不再集成到系統中。 假設我們已經為項目A和活動調試配置提供了工作空間,而不是工作應用程序。 然后我們可以在當前工作空間中創建安裝程序項目,比如說C,添加我們的應用程序(或嚴格地說,使用活動配置的項目)。 安裝程序安裝程序項目將我們的可執行文件放在某個地方(桌面是關於這種情況的正確位置)啟用依賴項檢查和一些其他次要屬性。 然后構建項目C並運行安裝程序(或使用上下文菜單從VS“安裝”)。 現在您的應用程序和使用debug dll庫創建的其他應用程序開始工作。
當你使用“刪除”選項運行安裝程序時要小心,你來到了以前的情況。 這是與分發主題相關的好文章: http : //blogs.msdn.com/b/vcblog/archive/2007/10/12/how-to-redistribute-the-visual-c-libraries-with-your-application .aspx 。
如果您有其他一些應用程序,並希望僅通過復制來部署它們,可能在沒有安裝VS的非開發機器上,您可以創建虛擬項目以及適當的配置和安裝程序。 然后在每台計算機上安裝一次,然后復制您正在處理的可執行文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.