Pergunta

Meu C (++) programa, escrito e compilado usando Visual C (++) / Visual Studio, funciona muito bem na minha própria máquina, mas se recusa a executar em outra máquina. A mensagem de erro que recebo é "Esta aplicação falhou ao iniciar porque a configuração da aplicação está incorrecta. A reinstalação do aplicativo pode corrigir esse problema."

Foi útil?

Solução

Se você escrever um programa em C ++, que vincula dinamicamente para o Runtime Library C, ou CRT para breve. Esta biblioteca contém o printf, seu malloc, seu strtok, etcetera. A biblioteca está contida no arquivo chamado Msvcr80.dll. Este arquivo não é, por padrão instalado em um sistema Windows, portanto, o aplicativo não pode ser executado.

A solução? Ou instalar a DLL na máquina de destino através Vcredist.exe (o Visual C ++ Redistributable Package), ou link para o CRT estaticamente (conecte o código real para as funções utilizadas diretamente em seu EXE).

distribuição e instalação vcredist juntamente com uma aplicação simples é um pé no saco, então eu fui para a segunda opção: vinculação estática. É muito fácil: vá para as propriedades do seu projeto, desdobrar C / C ++, clique em Geração de código, e definir a Biblioteca Runtime para uma das opções não-DLL. Isso é tudo que existe para ela.

Outras dicas

O problema aqui é uma dependência DLL em falta, como o CRT (C Runtime Library). Uma boa ferramenta para diagnosticar este tipo de problema é Dependency Walker (Depends.exe), que você pode encontrar aqui:

http://www.dependencywalker.com/

Você executar este programa no computador que gera a mensagem de erro que você postou, e usá-lo para abrir o exe que está gerando este erro. Dependência Walker rapidamente e graficamente indicar quaisquer DLLs que são necessários, mas não disponíveis na máquina.

As chances são altas de que você perca as bibliotecas de tempo de execução do Visual Studio (CRT entre outros), você pode se livrar dessas dependências (ligação estaticamente) ou instalar os pacotes redist VC no computador de destino.

Dependendo da versão do Visual C ++ que você usa, você tem que instalar pacotes diferentes:

Visual C ++ 2005

Visual C ++ 2005 SP1

Visual C ++ 2008

Aviso :. Aqueles pacotes contêm apenas versões de lançamento das bibliotecas, se você quer ser capaz de distribuir compilações de depuração do seu aplicativo que você vai ter que cuidar da DLL exigida-se

É muito mais simples ao link para o tempo de execução estaticamente.

c ++ -> Geração de código -> Runtime Library e selecione "multi-threaded / MT"

No entanto, isso faz seu um par executável cem KByte maior. Isso pode ser um problema se você estiver instalando um grande número de pequenos programas, uma vez que cada um será sobrecarregado por sua própria cópia do tempo de execução. A resposta é criar um instalador.

Novo projeto -> "instalação e implantação" -> "projeto de instalação"

Coloque a saída de seus projetos de aplicativos (definidos usando a versão DLL do tempo de execução) para o projeto de instalação e construí-lo. A dependência do DLL de tempo de execução será notado, incluído no pacote de instalação, e ordenadamente e discretamente instalado no lugar correto na máquina de destino.

O pacote VC Redist correto para você é parte da instalação do Visual Studio. Para VC 8, você pode encontrá-lo aqui:

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

SOLUÇÃO POSSÍVEL ........

EDIT: (retirado a maior parte do meu post) Para encurtar a história, eu estava tendo problemas semelhantes, recebendo as mensagens "Configuração aplicação incorrecta", etc etc. Depends.exe só foi encontrar ieshims.dll e wer.dll como possíveis problemas, mas isso não é o problema. Acabei usando a opção de compilação (multithreaded / mt). O que funcionou, porém, como uma solução viável, está fazendo um instalador com o InstallShield. Eu selecionei vários módulos de mesclagem no construtor installshield e este parece ter corrigido o meu problema. Os módulos seleccionados foram: VC ++ 9,0 CRT, VC ++ 9,0 DEPURAR CRT, e o módulo de fusão CRT winsxs HSH. Tenho certeza de que seus os winsxs módulo de mesclagem que fixa-lo.

DEBUG CRT: Notei algum lugar que (não importa o quão duro eu tentei, e, obviamente, não conseguiu até agora), a minha versão Release ainda dependia de depuração CRT. Se este ainda é o caso, o módulo de mesclagem do InstallShield colocou agora a pasta de depuração CRT em meus WinSxS pasta :) Sendo um pouco de um novato com VC ++ Eu supor que este seria normalmente utilizada para distribuir versões de depuração de seus programas para outras pessoas. Para testar se isso é o que fixa o meu problema que eu removido a pasta de depuração CRT a partir da pasta WinSxS eo aplicativo ainda funcionava. (A menos que algo ainda está em execução em segundo plano etc etc - Eu não sou tão nele)

coisas De qualquer forma, este tem que trabalham para mim em um XP SP3 máquina totalmente atualizado, e também em uma máquina VMWare XP SP3 com o esqueleto (NET 3.5 e VC ++ 2008 RTM basicamente) - e também na máquina XP de um companheiro onde antes não estava funcionando.

Assim, dar a estas coisas uma tentativa, você pode ter um pouco de sorte.

A primeira coisa que você deve usar

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

ou add _BIND_TO_CURRENT_VCLIBS_VERSION=1 com as directivas de pré-processamento.

O problema está relacionado à ligação e os tipos de manifesto, você pode encontrar mais http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/

Ao fazer isso o seu aplicativo será executado com uma maior gama de versões de bibliotecas de tempo de execução.

Muitas vezes este erro é o resultado de tentar executar a versão de depuração de um aplicativo que usa .NET. Uma vez que o pacote redistribuível do .NET não inclui as versões de depuração das DLLs que são instalados com Visual Studio, sua aplicação, muitas vezes, obter este erro quando executá-lo em qualquer outra máquina que não tenha Visual Studio instalado. Se você não tiver, tente construir uma versão do seu aplicativo e ver se isso funciona.

Note também - que se você mudar para execução estática, você terá que fazer o mesmo para MFC se o seu aplicativo usa MFC. Essas configurações estão em Propriedades-> Configuração / Geral

Eu corri para este problema e foi capaz de corrigi-lo de maneira muito simples.

Visual Studio dá-lhe a opção (por padrão) para construir um manifesto para cada compilação.

O manifesto foi colocado na pasta autorização, mas era uma pasta versão diferente do que o exe.

Mesmo quando se utiliza os utilitários de configuração não foi embalado.

Você deve procurar um nomes de arquivo algo como myprogram.exe.indermediate.manifest

Se isto está na mesma pasta que o exe (e você tem todas as DLLs) ele deve ser executado

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top