簡體   English   中英

Visual C ++ / Studio:應用程序配置不正確?

[英]Visual C++/Studio: Application configuration incorrect?

我的C(++)程序,使用Visual C(++)/ Visual Studio編寫和編譯,在我自己的機器上運行良好,但拒絕在另一台機器上運行。 我得到的錯誤消息是“此應用程序無法啟動,因為應用程序配置不正確。重新安裝應用程序可能會解決此問題。”

如果編寫C ++程序,它會動態鏈接到C運行時庫或簡稱CRT。 這個庫包含你的printf,malloc,你的strtok等等。 該庫包含在名為MSVCR80.DLL的文件中。 默認情況下,此文件未安裝在Windows系統上,因此無法運行該應用程序。

解決方案? 通過VCREDIST.EXE(Visual C ++ Redistributable Package)在目標計算機上安裝DLL,或靜態鏈接到CRT(將已使用函數的實際代碼直接插入EXE)。

分發和安裝VCREDIST以及一個簡單的應用程序是一個痛苦的屁股,所以我去了第二個選項:靜態鏈接。 這很簡單:轉到項目的屬性,展開C / C ++,單擊代碼生成,並將運行時庫設置為其中一個非DLL選項。 這里的所有都是它的。

這里的問題是缺少DLL依賴,例如CRT(C運行時庫)。 診斷此類問題的一個很好的工具是Dependency Walker(depends.exe),您可以在此處找到:

http://www.dependencywalker.com/

您將在生成您發布的錯誤消息的計算機上運行此程序,並使用它來打開生成此錯誤的exe。 Dependency Walker將快速並以圖形方式指示機器上所需但不可用的任何DLL。

如果您錯過了Visual Studio的運行時庫(CRT等),您可以擺脫這些依賴關系(靜態鏈接)或在目標計算機上安裝VC redist包。

根據您使用的Visual C ++版本,您必須安裝不同的包:

Visual C ++ 2005

Visual C ++ 2005 SP1

Visual C ++ 2008

警告 :這些軟件包僅包含庫的發行版本,如果您希望能夠分發應用程序的調試版本,則必須自己處理所需的DLL。

靜態鏈接到運行時是最簡單的。

c ++ - >代碼生成 - >運行時庫並選擇“多線程/ MT”

但是,這確實使您的可執行文件大了幾百KB。 如果要安裝大量小程序,這可能會成為一個問題,因為每個程序都有自己的運行時副本。 答案是創建一個安裝程序。

新項目 - >“設置和部署” - >“設置項目”

將應用程序項目的輸出(使用運行時的DLL版本定義)加載到安裝程序項目中並構建它。 將注意到對運行時DLL的依賴性,包含在安裝程序包中,並且整齊且不顯眼地安裝在目標計算機上的正確位置。

適合您的VC Redist軟件包是Visual Studio安裝的一部分。 對於VC 8,您可以在此處找到它:

\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86

可能的解決方案........

編輯:(刪除我的大部分帖子)長話短說,我有類似的問題,得到“應用程序配置不正確”的消息等等.Depends.exe只發現ieshims.dll和wer.dll作為可能的問題,但這不是問題。 我最終使用了多線程(/ mt)編譯選項。 然而,作為一種可行的解決方案,HAS使用InstallShield制作安裝程序。 我在installshield builder中選擇了幾個合並模塊,這似乎解決了我的問題。 選擇的模塊是:VC ++ 9.0 CRT,VC ++ 9.0 DEBUG CRT和CRT WinSXS MSM合並模塊。 我很確定它的WinSXS合並模塊已修復它。

DEBUG CRT:我注意到某個地方(無論我怎么努力,到目前為止顯然都失敗了),我的Release版本仍然依賴於DEBUG CRT。 如果仍然如此,InstallShield合並模塊現在已經將DEBUG CRT文件夾放在我的WinSXS文件夾中了。對於VC ++來說,我有點新手,我認為這通常會用於將程序的調試版本分發給其他人。 為了測試這是否解決了我的問題我從WinSXS文件夾中刪除了DEBUG CRT文件夾,應用程序仍然有用。 (除非某些東西仍然在后台運行等等 - 我不是那樣的)

無論如何,這已經讓我在XP SP3全面更新的機器上運行,並且還在具有裸機的VMWare XP SP3機器上(基本上是.net 3.5和VC ++ 2008 RTM) - 以及之前的配對XP機器上沒有用。

所以試試這些東西,你可能會有一些運氣。

首先要做的就是使用它

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

或者將_BIND_TO_CURRENT_VCLIBS_VERSION=1添加到預處理程序指令中。

問題與綁定和清單類型有關,你可以找到更多http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/

通過這樣做,您的應用程序將運行更大范圍的運行時庫版本。

我遇到了這個問題,並且能夠非常簡單地修復它。

Visual Studio為您提供了為每個構建構建清單的選項(默認情況下已啟用)。

清單放在release文件夾中,但它是一個與exe不同的release文件夾。

即使使用安裝實用程序,它也沒有打包。

您應該查找類似myprogram.exe.indermediate.manifest的文件名

如果它與exe在同一文件夾中(並且你有所有的dll)它應該運行

另請注意 - 如果您更改為靜態運行時,如果您的應用使用MFC,則必須對MFC執行相同操作。 這些設置位於properties-> Configuration / General中

通常,此錯誤是嘗試運行使用.NET的應用程序的調試版本的結果。 由於.NET可再發行組件包不包含隨Visual Studio一起安裝的dll的調試版本,因此在未安裝Visual Studio的任何其他計算機上運行時,您的應用程序通常會收到此錯誤。 如果您還沒有,請嘗試構建應用程序的發布版本,看看是否有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM