PkLab.Net - Meccatronica
Italiano English

Howto create a DLL without debug information in VisualC++

Last update: 18/11/2009 - Viewed: 1347 dal 18 Nov 2009 - Vote:0.0 (0 Votes)
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:

Keywords: Visual Studio, DLL
Categories: Visual Studio
Vote this page
0    1    2    3    4    5   

Leave your comment:

Name:

Email:

Emails will not be visible or used in any way, and are not required

Comment:


Verify code:


Type the code you can see here on the left
 

Note:
  • Please keep comments relevant
  • Any content deemed inappropriate or offensive may be edited and/or deleted
  • No HTML code is allowed. Line breaks will be converted automatically. URLs will be auto-linked. Please use BBCode to format your No HTML code is allowed. Please use BBCode to format your text
  • URLs, complete of "http://" o "mailto:" , will be auto-linked
  • Nota: questo materiale è di proprietà di Pk Lab ed è utilizzabile liberamente a condizione di citarne la fonte
    [Home Page]  [Search]
    Copyright PkLab (c) 2009
    Contatto: