Italiano - English

Howto create a DLL without debug information in Visual Studio

Translation for this document is not available or is not complete,
if you are intrested to receive information please write to

If you create a DLL that using runtime library then DLL's client application must load required runtime library. If runtime libs loaded by client application aren't same than required by your DLL you will have "unable to run your application. MSVCR80 was not found...."

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:

Vote this page:

1 Comments:

#1 Sent by lamnkand-online 17-10-2010

imparato molto

Leave your comment:

Note:
  • Your email email will not be visible or used in any way, and is not required
  • Please keep comments relevant
  • Any content deemed inappropriate or offensive may be edited and/or deleted
  • HTML code is not allowed. Please use BBCode to format your text
    [b]bold[/b], [u]underline[/u], [i]italic[/i], [code]code[/code]
The coding examples presented here are for illustration purposes only. The author takes no responsibility for end-user use
This work is property of Pk Lab. You can use it for free but you must retain author's copyright.