views:

3580

answers:

12

My C(++) program, written and compiled using Visual C(++)/Visual Studio, runs fine on my own machine, but refuses to run on another machine. The error message I get is "This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem."

+4  A: 

If you write a C++ program, it links dynamically to the C Runtime Library, or CRT for short. This library contains your printf, your malloc, your strtok, etcetera. The library is contained in the file called MSVCR80.DLL. This file is not by default installed on a Windows system, hence the application cannot run.

The solution? Either install the DLL on the target machine through VCREDIST.EXE (the Visual C++ Redistributable Package), or link to the CRT statically (plug the actual code for the used functions straight into your EXE).

Distributing and installing VCREDIST along with a simple application is a pain in the arse, so I went for the second option: static linking. It's really easy: go to your project's properties, unfold C/C++, click Code Generation, and set the Runtime Library to one of the non-DLL options. That's all there is to it.

Thomas
Good answer, just want to add that static linking may significantly increase size of your application.
Serge
also - if it uses MFC, have to also set that property. See my post below for location.
Tim
A: 

Often times this error is the result of attempting to run the debug version of an application that uses .NET. Since the .NET redistributable package doesn't include the debug versions of the dlls that are installed with Visual Studio, your application will often get this error when running it on any other machine that doesn't have Visual Studio installed. If you haven't already, try building a release version of your application and see if that works.

BeachRunnerJoe
+5  A: 

The problem here is a missing DLL dependency, such as the CRT (C Runtime Library). A good tool for diagnosing this sort of problem is Dependency Walker (depends.exe), which you can find here:

http://www.dependencywalker.com/

You would run this program on the computer that generates the error message you posted, and use it to open the exe that's generating this error. Dependency Walker will quickly and graphically indicate any DLLs that are required but not available on the machine.

Charlie
Using depends.exe doesn't help if there are manifest related issue and this is #1 cause for the specified error.
Sorin Sbarnea
+1  A: 

Chances are high that you miss the runtime libraries of Visual Studio (CRT amongst others), you can either get rid of those dependencies (link statically) or install the VC redist packages on the target computer.

Depending on the Visual C++ version you use, you have to install different packages :

Visual C++ 2005

Visual C++ 2005 SP1

Visual C++ 2008

Warning : those packages only contain release versions of the libraries, if you want to be able to distribute debug builds of your application you'll have to take care of the required DLL yourself.

Drealmer
A: 

It is much the simplest to link to the runtime statically.

c++ -> Code Generation -> Runtime Library and select "multi-threaded /MT"

However, this does make your executable a couple hundred KByte larger. This might be a problem if you are installing a large number of small programs, since each will be burdened by its very own copy of the runtime. The answer is to create an installer.

New project -> "setup and deployment" -> "setup project"

Load the output from your application projects ( defined using the DLL version of the runtime ) into the installer project and build it. The dependency on the runtime DLL will be noticed, included in the installer package, and neatly and unobtrusively installed in the correct place on the target machine.

ravenspoint
A: 

The correct VC Redist package for you is part of your Visual Studio installation. For VC 8, you can find it here:

\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86
Scott Danahy
A: 

Note also - that if you change to static runtime, you will have to do the same for MFC if your app uses MFC. Those settings are in properties->Configuration/General

Tim
+1  A: 

POSSIBLE SOLUTION........

EDIT: (removed most of my post) Long story short, I was having similar problems, getting the "Application Configuration Incorrect" messages, etc etc. Depends.exe was only finding ieshims.dll and wer.dll as possible issues, but this is not the problem. I ended up using the Multithreaded (/mt) compile option. What HAS worked though, as a workable solution, is making an installer with InstallShield. I've selected several merge modules in installshield builder and this seems to have fixed my problem. The modules selected were: VC++ 9.0 CRT, VC++ 9.0 DEBUG CRT, and the CRT WinSXS MSM merge module. I'm pretty sure its the WinSXS merge module that has fixed it.

DEBUG CRT: I noticed somewhere that (no matter how hard I tried, and obviously failed thus far), my Release version still depended on the DEBUG CRT. If this is still the case, the InstallShield merge module has now placed the DEBUG CRT folder in my WinSXS folder :) Being somewhat of a novice with VC++ I assume that this would normally be used to distribute debug versions of your programs to other people. To test if this is what fixed my problem I removed the DEBUG CRT folder from the WinSXS folder and the application still worked. (Unless something is still running in the background etc etc - I'm not that into it)

Anyway, this has got things working for me on an XP SP3 fully updated machine, and also on a VMWare XP SP3 machine with the bare bones (.net 3.5 and VC++ 2008 RTM basically) - and also on a mate's XP machine where it previously wasn't working.

So give these things a try, you might have some luck.

mad_dog
This should be a question, not an answer. Anyway... If you're using `/CLR:pure`, then you're writing a managed application. Your problem is most likely very different from this.
Thomas
A: 

I ran into this problem and was able to fix it very simply.

Visual studio gives you the option (on by default) to build a manifest for each build.

The manifest was put in the release folder, but it was a different release folder than the exe.

Even when using the setup utilities it was not packaged.

You should look for a file names something like myprogram.exe.indermediate.manifest

If this is in the same folder as the exe (and you have all the dlls) it should run

Jeff
+2  A: 

First thing you must use

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

or add _BIND_TO_CURRENT_VCLIBS_VERSION=1 to the preprocessor directives.

The problem is related to binding and the manifest types, you can find more http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/

By doing this your application will run with a larger range of runtime libraries versions.

Sorin Sbarnea
A: 

Hi All,

I had same prolem. But I downloaded and run the "VCREDIST", it did not work for my software. Same error information again. I did the changes to "Multi-threaded(/MT)" and "No Common Language Runtime support", it would give me a lot errors about namespace, that could not pass the compiler. If I only chose one change, it showed me "'/MT' and '/clr:pure' command-line options are incompatible". Any idea to solve the problem? I really appreciate any reply or solution for the problem. Thanks!

John

John
A: 

Thanks for everyone who replied my question.

I still have the problem. I did get the vcredist_x86 from "C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\vcredist_x86" since I am using VS2008 which contains VC9.0. I did run the vcredist_x86 on another computer and finished successful, but my software did have the same problem. I copied my application software into same or closed folder under WinSxS folder, it still did not work.

I think the problem is about the debug version. How can I turn off "debug" model to generate new code and software? Right now I am using "Multi-threaded Debug DLL (/MDd)" under code generation option. If I change it to any other option, I would get "incompatible" error or could not pass the compiling error.

When I try to build a new project creating an installer, I could not find " "setup and deployment" -> "setup project"" from the new project options.

Any helps? Thank you very much!!!

John

John
@John: Welcome to Stack Overflow! I think your issue is different from the one stated in my question. You'll get better answers if you ask a new question providing all those details.
Thomas