Domanda

Il mio programma C(++), scritto e compilato utilizzando Visual C(++)/Visual Studio, funziona correttamente sul mio computer, ma si rifiuta di funzionare su un altro computer.Il messaggio di errore che ricevo è "L'avvio dell'applicazione non è riuscito perché la configurazione dell'applicazione non è corretta.Reinstallare l'applicazone potrebbe risolvere questo problema."

È stato utile?

Soluzione

Se scrivi un programma C++, si collega dinamicamente alla C Runtime Library, o CRT in breve.Questa libreria contiene il tuo printf, il tuo malloc, il tuo strtok, eccetera.La libreria è contenuta nel file chiamato MSVCR80.DLL.Questo file non è installato per impostazione predefinita su un sistema Windows, quindi l'applicazione non può essere eseguita.

La soluzione?Installa la DLL sul computer di destinazione tramite VCREDIST.EXE (il pacchetto ridistribuibile di Visual C++) o collega il CRT in modo statico (collega il codice effettivo per le funzioni utilizzate direttamente nel tuo EXE).

Distribuire e installare VCREDIST insieme ad una semplice applicazione è una seccatura, quindi ho optato per la seconda opzione:collegamento statico.È davvero facile:vai alle proprietà del tuo progetto, apri C/C++, fai clic su Generazione codice e imposta la libreria di runtime su una delle opzioni non DLL.Questo è tutto.

Altri suggerimenti

Il problema qui è una dipendenza DLL mancante, come CRT (C Runtime Library).Un buon strumento per diagnosticare questo tipo di problema è Dependency Walker (depends.exe), che puoi trovare qui:

http://www.dependencywalker.com/

Dovresti eseguire questo programma sul computer che genera il messaggio di errore che hai pubblicato e utilizzarlo per aprire l'exe che genera questo errore.Dependency Walker indicherà rapidamente e graficamente tutte le DLL necessarie ma non disponibili sulla macchina.

È molto probabile che ti manchino le librerie runtime di Visual Studio (CRT tra gli altri), puoi eliminare tali dipendenze (collegamento statico) o installare i pacchetti redist VC sul computer di destinazione.

A seconda della versione di Visual C++ che usi, devi installare diversi pacchetti:

Visual C++ 2005

Visual C++ 2005 SP1

Visual C++ 2008

Avvertimento :questi pacchetti contengono solo versioni di rilascio delle librerie, se vuoi essere in grado di distribuire build di debug della tua applicazione dovrai occuparti tu stesso della DLL richiesta.

È decisamente più semplice collegarsi staticamente al runtime.

c++ -> Generazione codice -> Libreria runtime e seleziona "multi-thread /MT"

Tuttavia, questo rende il tuo eseguibile più grande di un paio di centinaia di KByte.Questo potrebbe essere un problema se si installa un gran numero di piccoli programmi, poiché ognuno sarà gravato dalla propria copia del runtime.La risposta è creare un programma di installazione.

Nuovo progetto -> "configurazione e distribuzione" -> "progetto di configurazione"

Carica l'output dai progetti dell'applicazione (definiti utilizzando la versione DLL del runtime) nel progetto di installazione e crealo.La dipendenza dalla DLL runtime verrà notata, inclusa nel pacchetto di installazione e installata in modo ordinato e discreto nella posizione corretta sul computer di destinazione.

Il pacchetto VC Redist corretto per te fa parte dell'installazione di Visual Studio.Per VC 8, puoi trovarlo qui:

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

POSSIBILE SOLUZIONE........

MODIFICARE:(rimosso la maggior parte del mio post) Per farla breve, stavo avendo problemi simili, ottenendo messaggi "Configurazione dell'applicazione errata", ecc. Ecc.Depends.exe trovava solo ieshims.dll e wer.dll come possibili problemi, ma non è questo il problema.Alla fine ho utilizzato l'opzione di compilazione Multithreaded (/mt).Ciò che ha funzionato, tuttavia, come soluzione praticabile, è creare un programma di installazione con InstallShield.Ho selezionato diversi moduli di unione in installshield builder e questo sembra aver risolto il mio problema.I moduli selezionati sono stati:VC++ 9.0 CRT, VC++ 9.0 DEBUG CRT e il modulo di unione CRT WinSXS MSM.Sono abbastanza sicuro che sia stato il modulo di unione WinSXS a risolvere il problema.

DEBUG CRT:Ho notato da qualche parte che (non importa quanto ci ho provato, e ovviamente finora ho fallito), la mia versione di rilascio dipendeva ancora dal DEBUG CRT.Se è ancora così, il modulo di unione InstallShield ha ora inserito la cartella DEBUG CRT nella mia cartella WinSXS :) Essendo un po' un principiante con VC++ presumo che questo verrebbe normalmente utilizzato per distribuire versioni di debug dei tuoi programmi ad altre persone.Per verificare se questo è ciò che ha risolto il mio problema, ho rimosso la cartella DEBUG CRT dalla cartella WinSXS e l'applicazione funzionava ancora.(A meno che qualcosa non sia ancora in esecuzione in background, ecc. Ecc. - Non mi interessa)

Ad ogni modo, questo ha fatto funzionare le cose per me su una macchina XP SP3 completamente aggiornata, e anche su una macchina VMWare XP SP3 con le ossa nude (.net 3.5 e VC++ 2008 RTM sostanzialmente) - e anche sulla macchina XP di un amico dove in precedenza non funzionava.

Quindi prova queste cose, potresti avere un po' di fortuna.

La prima cosa che devi usare

#define _BIND_TO_CURRENT_VCLIBS_VERSION 1

o aggiungi _BIND_TO_CURRENT_VCLIBS_VERSION=1 alle direttive del preprocessore.

Il problema è legato all'associazione e ai tipi manifest, puoi trovare di più http://www.nuonsoft.com/blog/2008/10/29/binding-to-the-most-recent-visual-studio-libraries/

In questo modo la tua applicazione verrà eseguita con una gamma più ampia di versioni delle librerie runtime.

Spesso questo errore è il risultato del tentativo di eseguire la versione di debug di un'applicazione che utilizza .NET.Poiché il pacchetto ridistribuibile .NET non include le versioni di debug delle DLL installate con Visual Studio, l'applicazione riceverà spesso questo errore quando viene eseguita su qualsiasi altro computer su cui non è installato Visual Studio.Se non l'hai già fatto, prova a creare una versione di rilascio della tua applicazione e verifica se funziona.

Tieni inoltre presente che se passi al runtime statico, dovrai fare lo stesso per MFC se la tua app utilizza MFC.Queste impostazioni si trovano in Proprietà->Configurazione/Generale

Ho riscontrato questo problema e sono riuscito a risolverlo in modo molto semplice.

Visual Studio offre la possibilità (attiva per impostazione predefinita) di creare un manifest per ogni build.

Il manifest è stato inserito nella cartella di rilascio, ma era una cartella di rilascio diversa da quella dell'exe.

Anche quando si utilizzavano le utilità di installazione non era incluso nel pacchetto.

Dovresti cercare un nome file simile a myprogram.exe.indermediate.manifest

Se si trova nella stessa cartella dell'exe (e hai tutte le DLL), dovrebbe essere eseguito

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top