Italiano - English

Creare correttamente una DLL senza informazioni di debug con Visual Studio

Se una DLL viene creata con le librerie di runtime, si demanda alla applicazione client il caricamento del runtime stesso. Se il runtime richiesto dalla libreria è diferente da quello utilizzato dall'applicazione, all'esecuzione dell'applicazione si avrà l'errore "Impossibile avviare l'applicazione specificata. MSVCR80 non è stato trovato. Una nuova ...."

Un caso tipico in cui si verifica il problema è nel collegamento di una DLL che non contiene informazioni di debug, con una applicazione che al contrario le contiene, quando la DLL è stata compilata con l'opzione DLL multithread (/MD) del compilatore

Ad esempio, abbiamo fornito una DLL ad un cliente il quale deve realizzare una applicazione che utilizza la nostra libreria, fornita appunto come DLL. Naturalmente la nostra libreria è in versione Release quindi ottimizzata e senza le informazioni di debug. Al contrario il cliente deve sviluppare la nuova applicazione, quindi utilizza il Debug per controllare il proprio software.

Bene, nella circostanza appena descritta, se la DLL è stata compilata con le librerie di runtime dinamiche (/MD) , si richiede che il codice effettivo contenuto in MSVCR80.DLL, deve essere disponibile in fase di esecuzione.

Tuttavia l'applicazione del nostro cliente, carica la runtime MSVCR80.DLL solo nella versione Release della sua applicazione, mentre le applicazioni compilate con le informazioni di debug caricano la versione debug delle runtime , ovvero MSVCR80D.DLL

Ecco perchè, se si lancia l'applicazione in versione Release tutto funziona regolarmente, se si lancia l'applicazione in versione Debug compare l'errore di cui sopra.

La soluzione

Ci sono due soluzioni

Soluzione 1

Creare due versioni della libreria una in versione Release ed una in versione Debug. Il nostro cliente utilizzerà la versione appropriata. Questa soluzione potrebbe non piacere perche' richiede la distribuzione di una versione della DLL che è piu' esposta al reverse engineering, ma è la soluzione più ottimizzata.

Per ottenere due DLL differenti è sufficiente impostare un nome diverso come "file di output" nelle due Soluzioni Visual Studio relative alla DLL

Soluzione 2

Creare una DLL con librerie di runtime statiche, ovvero includere nella DLL la libreria di runtime. In questo caso la DLL ingrassa, è autonoma e può essere utilizzata sia da applicazioni in versione Debug che in versione Release.

Per creare una DLL con librerie statiche è necessario attivare l'opzione /MT del compilatore

Proprietà del progetto della DLL, Selezionare la versione Release , Proprietà di Configurazione -> C/C++ -> Generazione Codice -> Libreria di runtime : Multithread (/MT)

Conclusioni

Ho perso qualche ora del mio tempo a cercare la causa del problema, Utilizzando "Dependency Walker" ho potuto analizzare analiticamente tutte le dipendenze della applicazione e della DLL, così ho risolto l'arcano. I miei complimenti all'autore.

Ulteriori informazioni:

Vota questa pagina:

1 Commenti:

#1 Inviato da lamnkand-online 17-10-2010

imparato molto

Lascia il tuo commento:

Note:
  • La tua email non è obligatoria e non sarà visibile in alcun modo
  • Si prega di inviare solo commenti relativi a questa pagina
  • Commenti inappropriati o offensivi saranno modificati o eliminati
  • Codici HTML non sono consentiti. Prego usare i BB code:
    [b]bold[/b], [u]underline[/u], [i]italic[/i], [code]code[/code]
Il codice, le illustrazioni e gli esempi riportati in questa pagina sono solo a scopo illustrativo. L'autore non prende alcuna responsabilità per il loro utilizzo da parte dell'utente finale.
Questo materiale è di proprietà di Pk Lab ed è utilizzabile liberamente a condizione di citarne la fonte.