PDA

View Full Version : [VC++] Soluzioni multiprogetto


zarko
28-03-2009, 18:28
Ciao a tutti,
Rieccomi con un nuovo problema... Ho una soluzione composta da due progetti:
->Il progetto di avvio, che compilo come eseguibile.
->Una libreria, con classi e funzioni per il primo progetto.
Adesso i problemi sono due... compilando come .lib o .dll tutto ok ma dall'eseguibile ottengo questo errore:
Errore 1 error LNK2019: riferimento al simbolo esterno "class classe __cdecl cl(void)" (?cl@@YA?AVclasse@@XZ) non risolto nella funzione _main main.obj ProvaLinker
Errore 2 fatal error LNK1120: 1 esterni non risolti C:\Users\Mattia\Desktop\ProvaLinker\Debug\ProvaLinker.exe ProvaLinker

Come devo configurare i due progetti? Quando conviene usare dlll e quando .lib? qual'è la differenza?

Grazie,
Zarko.

BrutPitt
29-03-2009, 05:12
Il programma non trova il riferimento alla funzione "cl()" che tu stai chiamando da "main"

Normalmente cio' accade quando la funzione in questione e' definita in prototipo, ma il linker non ne trova il "corpo".

In pratica, o hai dimenticato di includere la libreria in questione al linker (in VC, Linker->Input->AdditionalDipendencies) ... o la funzione e' riconosciuta diversamente in base ai parametri formali (differenza tra prototipo e copro della funzione).


Per quanto riguarda la differenza tra Libreria (statica) e DynamicLinkLibrary, lo dice il nome.

L'una viene collegata staticamente, ossia il corpo della funzione o delle funzioni, usate dal tuo programma, risiedono nell'eseguibile.
Nel secondo caso, le funzioni risidono in un file esterno,DLL appunto, e nel tuo programma esiste solo il "riferimento" a dove siano.

Alcuni vantaggi di una DLL (o libreria dinamica in genere) sono che la libreria puo' essere allocata in memoria dinamicamente e "scaricata" quando non serve piu'.
Inoltre, un'unica allocozione (unica area di memoria) e' condivisibile da piu' programmi che ne facciano uso, mentre con una libreria statica ogni programma ha la propria copia delle funzioni in memoria.

Di contro hai una gestione dell'istallazione: una DLL deve trovarsi nella cartella a cui l'eseguibile fa riferimento o nel PATH degli eseguibili.

zarko
29-03-2009, 12:37
Grazie mille! :)