 
View Full Version : c++: creare una dll
ciao a tutti!
vorrei riuscire a creare una dll, riesco gia' a creare librerie dinamiche, c'e' molta differenza?
ciao ciao e grazid
ciao a tutti!
vorrei riuscire a creare una dll, riesco gia' a creare librerie dinamiche, c'e' molta differenza?
ciao ciao e grazid
Una libreria dinamica è una dll non c'è differenza, quindi sei a posto già ci sei riuscito.
Una libreria dinamica è una dll non c'è differenza, quindi sei a posto già ci sei riuscito.
ok, ma una volta creata la dll in fase di linking mi dice che non riesce a risolvere le funzioni che ho utilizzato.
ciao e grazie
ok, ma una volta creata la dll in fase di linking mi dice che non riesce a risolvere le funzioni che ho utilizzato.
ciao e grazie
se usi il compilatore vc6 o NET crea un progetto per una dll NON MFC 
nelle opzioni del compilatore di default avrai che compilando il progetto ti creerà per esmpio tua.dll e tua.lib se usi. 
Usando queste opzioni devi portare nella dir dell'exe la dll e la lib che hai creato. 
avrai anche tua.cpp e tua.h 
Se hai fatto questa scelta sopra, nel progetto devi mettere anche un file che si chiama per esmpio tua.def lo crei con il notepad e lometti nel progetto. Nel file.def ci devi scrivere questo: 
LIBRARY tua 
EXPORTS 
perchè stai usando una dll dinamca e la sua lib quindi in questo caso la dll deve sapere le funzioni che esporterai. 
se nelle opzioni del compilatore scegli l'opzione Static Library allora non ti serve + avere il file.def perchè il tutto è compreso nell'unico file che ti verrà creato che si chiama tua.lib infatti avrà dimensioni maggiori. 
Dunque se opti per la dll + la lib nel file.def (che sarebbe tua.def che hai creato) devi mettere la funzione da esportare. 
esempio: 
LIBRARY tua 
EXPORTS 
Inizializzazione 
ora nel file tua.h immetti la funzione da esportare che è: 
extern "C" void __declspec (dllexport) Inizializzazione(); 
magari ti fai ritornare un true o false con questa: 
extern "C" bool __declspec (dllexport) RitornaFlag(); 
Nel file .cpp ci metti le funzioni così: 
Inizializzazione() 
{ 
...fai l'inizializzazione 
} 
bool RitornaFlag() 
{ 
return false; 
} 
Nel progetto dell'exe che richiama la dll e la lib oppure (come sopra) solo la lib perchè hai scelto la Static Library, in un file.h globale o nel cpp pricipale (il main) metti le stesse righe delle funzioni da esportare ovvero i prototipi. 
esempio ci incolli le stesse righe così: 
extern "C" void __declspec (dllexport) Inizializzazione(); 
extern "C" bool __declspec (dllexport) RitornaFlag(); 
Nel progetto che richiama la dll + la lib o solo la lib, nelle opzioni del compilatore devi includere tua.lib (se non funziona nulla) 
e come detto prima tua.lib e tua.dell o solo tua.lib deve stare nella dir del progetto dell'exe. 
dal mai del progetto per richiamare la funzione basta che metti la sua chiamata: 
esempio: 
Inizializzazione(); 
oppure 
if(RitornaFlag())//valore del flag di stato 
a=2; 
else 
a=3:
ciao.
uso CodeBlocks col compilatore "Microsoft Visual C++ Toolkit 2003".
Se gli dico di creare una libreria dinamica crea solo la dll e non la lib.
evidentemente o non esporti nessun simbolo oppure l'IDE non passa le opzioni giuste al compilatore; proverò a fare una ricerca per vedere come si chiamava l'opzione da dare ai compilatori Microsoft per generare il .lib...
boh, non la trovo: ho provato da Visual C++ 6 a creare una DLL selezionando l'opzione "Doesn't produce LIB", e il lib non me lo produce, ma nella command line non cambia nulla... ma hai esportato qualche simbolo dalla tua DLL?
Con il Visual C++ (penso tutte le versioni, sicuramente almeno le ultime), per generare una import library si usa l'opzione /IMPLIB:nomelib da passare al linker. Questa opzione comunque si può specificare nelle proprietà del progetto nella sezione Linker/Avanzate (per i VC++ che hanno l'IDE, naturalmente).
Nella documentazione dell'opzione /IMPLIB c'è però una nota interessante:
L'opzione /IMPLIB consente di eseguire l'override del nome predefinito per la libreria di importazione creata in LINK durante la generazione di un programma contenente esportazioni. Il nome predefinito è composto dal nome di base del file di output principale e dall'estensione LIB. Un programma contiene esportazioni se è specificato uno dei seguenti elementi: 
La parola chiave __declspec(dllexport) nel codice sorgente 
L'istruzione EXPORTS in un file DEF 
Una specifica /EXPORT in un comando LINK 
In LINK l'opzione /IMPLIB viene ignorata quando non viene creata alcuna libreria di importazione. Se non viene specificata alcuna esportazione, non verrà creata alcuna libreria di importazione. Se nella generazione viene utilizzato un file di esportazione, verrà presupposto che esista già una libreria di importazione e non ne verrà creata un'altra. Per informazioni sulle librerie di importazione e sui file di esportazione, vedere Riferimenti a LIB.
ciao.
uso CodeBlocks col compilatore "Microsoft Visual C++ Toolkit 2003".
Se gli dico di creare una libreria dinamica crea solo la dll e non la lib.
Ora te lo dico io:
1. menu project/proprietà e ti si apre la finestre delle opzioni di progetto
2. In Configuration propiertes/General clicca su Configuration Type e scegli: Dynamic Library (.dll)
3. poi C/C++/Code Generation clicca su Runtime Library e scegli:
Multi-threaded Debug (/MTd)
4. In Linker/General clicca su Output File e incolla questo:
se in release...            .\Release/Tua.dll
se in debug...             .\Debug/Tua.dll
5. in Input/Module Definition File metti: .\Tuo.def
Segui le istruzioni del mio post precedente e fai questi passaggi nelle opzioni.
ciao e facci sapere  ;)
Edit: CodeBlocks non lo conosco e non l'ho mai usato con vs7 2003 net
ciao
grazie a tutti!
domani provo e vi faccio sapere
ciao ciao e buona notte
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.