2012-07-23 5 views
5

Eventuali duplicati:
Windows & C++: extern & __declspec(dllimport)
Why/when is __declspec(dllimport) not needed?cosa fa __declspec (dllexport) fare, quando inserirlo prima di una funzione di importazione

Voglio scrivere un progetto DLL. Questo progetto include diverse DLL. Sono dipendenti. Mi definisco alcune macro come segue:

#ifdef MYDLL_DECL1 
    #define DLL_DECL __declspec(dllexport) 
#else 
    #define DLL_DECL __declspec(dllimport) 
#endif 

ho definito MYDLL_DECL1 ... MYDLL_DECLn per ogni modulo. Perché ho pensato se definissi la stessa macro che non avrebbe funzionato. Ma voglio davvero definire solo una macro e ho scritto un banco di prova. Ho due moduli. Nel secondo file sorgente di moudle. Scrivo codice come segue:

#define MYDLL_DECL 
#include "moudle1.h" 
#include "moudle2.h" 

Se io uso lo stesso nome di macro "MYDLL_DECL", per il file testa di modle1 ho definito "MYDLL_DECL", così "DLL_DECL" è uguale a '__declspec (dllexport)'. In realtà nel modulo2 dovrebbe essere uguale a "__declspec (dllimport)", poiché module2 import module1. Ma ho trovato funzionato quando ho appena definito una stessa macro per due moduli. E trovo anche che l'OpenCV usi anche questo strumento nella sua libreria

+2

... Cosa ?? Puoi usare '__declspec (dllimport)' direttamente senza dover definire la tua macro! –

+4

http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed – Mohammad

+0

__declspec (dllimport) è un identificatore di C/C++. Quindi posso usare – Samuel

risposta

5

Innanzitutto, pensa a ciò che ti serve senza la macro. Se una classe o la funzione è definita nel modulo 1, è necessario dichiararla __declspec(dllexport) nel modulo1 e __declspec(dllimport) in tutti gli degli altri moduli. Compreso nel file di intestazione in cui è dichiarato .

Dal momento che non si vuole mantenere due file header diversi, e si fai non quello compilazione condizionale in tutto il luogo, la soluzione migliore è utilizzare una macro condizionale definita, ad esempio:

#ifdef MODULE1 
#define MODULE1_DECL __declspec(dllexport) 
#else 
#define MODULE1_DECL __declspec(dllimport) 
#endif 

Quando si richiama il compilatore, si definisce solo MODULE1 nel modulo del progetto1; non lo definisci in nessun altro progetto. Pertanto, quando si compila il modulo 1, MODULE1_DECL si espande in __declspec(dllexport) e quando compila un altro modulo, si espande in __declspec(dllimport).

+0

Inoltre, è necessario definire MODULE1 ... MODULEn. Voglio solo definire una sola macro. Definisco una macro per tutti i moduli. E funziona. Perché l'ho trovato quando voglio importare altre DLL. Non ho bisogno dello specificatore __declspec (dllimport). – Samuel

+0

Ciao James Kanze, puoi aiutarmi a riaprire questa domanda. Ho modificato la mia domanda. Ora non è uguale a http://stackoverflow.com/questions/2288293/windows-c-extern-declspecdllimport e http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-non-necessario – Samuel

+0

@ Samuel Non so come funzioni questo forum, eccetto che le cose accadono arbitrariamente, per ragioni irrazionali. Tutto quello che posso dire è che se non usi lo specificatore '__declspec (dllimport)', e i simboli sono importati da un'altra unità di traduzione, hai un comportamento indefinito. Potrebbe funzionare, per alcuni tipi di simboli, ma non puoi contare su di esso. –

Problemi correlati