PDA

View Full Version : c++: creare una dll


Poix81
28-12-2005, 23:42
ciao a tutti!
vorrei riuscire a creare una dll, riesco gia' a creare librerie dinamiche, c'e' molta differenza?

ciao ciao e grazid

okay
29-12-2005, 00:17
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.

Poix81
29-12-2005, 09:24
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

okay
29-12-2005, 09:57
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:

Poix81
29-12-2005, 10:16
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.

71104
29-12-2005, 14:33
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...

71104
29-12-2005, 14:36
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?

andbin
29-12-2005, 15:07
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.

okay
29-12-2005, 16:03
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

Poix81
29-12-2005, 23:28
grazie a tutti!
domani provo e vi faccio sapere

ciao ciao e buona notte