cosa significa veramente __declspec (dllimport)?


Risposte:


118

__declspecè un attributo specifico di Microsoft che consente di specificare le informazioni sulla classe di archiviazione.
(Nitpicker's Corner: Tuttavia, un certo numero di altri fornitori di compilatori, ad esempio GCC, ora supportano questa estensione del linguaggio per la compatibilità con la base di codice installata che è stata scritta per i compilatori Microsoft. Alcuni forniscono anche attributi di classe di archiviazione aggiuntivi.)

Due di questi attributi della classe di archiviazione che possono essere specificati sono dllimporte dllexport. Indicano al compilatore che una funzione o un oggetto viene importato o esportato (rispettivamente) da una DLL.

Più specificamente, definiscono l'interfaccia della DLL con il client senza richiedere un file module-definition ( .DEF). La maggior parte delle persone trova molto più facile usare queste estensioni di lingua piuttosto che creare file DEF.

Per ovvie ragioni, __declspec(dllimport)e __declspec(dllexport)sono generalmente accoppiati tra loro. Si utilizza dllexportper contrassegnare un simbolo come esportato da una DLL e si utilizza dllimportper importare il simbolo esportato in un altro file.

Per questo motivo e poiché lo stesso file di intestazione viene generalmente utilizzato sia durante la compilazione della DLL che nel codice client che utilizza l'interfaccia della DLL, è un modello comune definire una macro che si risolve automaticamente nell'identificatore di attributo appropriato in fase di compilazione. Per esempio:

#if COMPILING_DLL
    #define DLLEXPORT __declspec(dllexport)
#else
    #define DLLEXPORT __declspec(dllimport)
#endif

E quindi contrassegnare tutti i simboli che dovrebbero essere esportati con DLLEXPORT.

Presumibilmente, questo è ciò che fa la Q_CORE_EXPORTmacro, risolvendo in Q_DECL_IMPORTo Q_DECL_EXPORT.


__declspec non è propriamente "specifico per MS" (è molto più "specifico per compilatore) e alcuni compilatori utilizzano questa dichiarazione anche per piattaforme multiple. Alcuni dei valori degli attributi sono (dllexport / dllimports sono specifici per MS, infatti, poiché DLL è MS lessico)
Emilio Garavaglia

9
@ Emilio: Per quanto ne so, Microsoft ha inventato la __declspecnotazione come estensione al linguaggio C ++. Credo che GCC ora lo supporti, ma principalmente per motivi di compatibilità con i compilatori Microsoft. E non capisco come "specifico per MS" sia diverso da "specifico per compilatore". Microsoft ha scritto un compilatore C ++ e molte persone lo usano. Viene fornito con Visual Studio.
Cody Grey

8
Microsoft crea un compilatore. Si chiama "Microsoft C / C ++ Optimizing Compiler", cl.exe. Molte persone si riferiscono erroneamente a Visual Studio come se fosse un compilatore, ma è un IDE. Non so perché la gente sia pignola su cosa significhi "specifico per Microsoft". Non significa un "ambiente MS" (qualunque cosa sia), e certamente non significa "Windows". Sì, altri fornitori di compilatori ora supportano l'estensione per la compatibilità con la base installata di codice scritto per i compilatori Microsoft. Come ho detto prima, per quanto ne so, Microsoft ha inventato la sintassi. Questo è il punto qui.
Cody Grey

2
@CodyGray: Microsoft averlo inventato da sola non sarebbe sufficiente. Comunque Microsoft lo abbia inventato, nessuno standard lo contenga, altri lo implementano solo per compatibilità e viene utilizzato principalmente (se non esclusivamente) per programmi mirati a Microsoft Windows insieme fanno un punto molto forte per chiamarlo "Microsoft specific"
celtschk

6
Questa è una risposta fantastica, specialmente la parte su "perché lo stesso file di intestazione viene generalmente utilizzato sia durante la compilazione della DLL che nel codice client"! Rende ogni aspetto delle cose di importazione / esportazione cristallino.
Ela782

30

__declspec(dllimport) è un identificatore di classe di archiviazione che indica al compilatore che una funzione, un oggetto o un tipo di dati è definito in una DLL esterna.

La funzione, l'oggetto o il tipo di dati viene esportato da una DLL con un file corrispondente __declspec(dllexport).


6
Ok. Alla fine, dopo 2 ore di lettura, ho trovato l'affermazione più soddisfacente, più concisa, accurata fino al punto di ciò che voglio.
el psy Congroo

1

__declspec(dllexport)dice al compilatore di informare il linker che questi simboli devono essere inseriti nella tabella di esportazione (durante la compilazione del file .dll). Quando si compila il programma che si collega con la .dll, __declspec(dllimport)dice al compilatore di produrre una chiamata indiretta di registro assoluta relativa a RIP (che il linker risolverà per puntare alla tabella di importazione) piuttosto che la solita diretta di registro relativa a RIPistruzione di chiamata indiretta a una funzione indefinita (che, non potendo modificare l'istruzione, il linker inserisce l'indirizzo relativo di un thunk e quindi crea il thunk, all'interno del quale colloca la chiamata indiretta di registro assoluto relativo a rip puntatore a funzione nella tabella di importazione). Questa è una dimensione del codice e un'ottimizzazione della velocità. È la libreria di importazione .lib che indica al linker quali simboli verranno importati e viene utilizzata come guida per creare la tabella di importazione e creare eventuali thunk necessari nel segmento .text.

https://docs.microsoft.com/en-us/cpp/build/importing-function-calls-using-declspec-dllimport?view=vs-2019 https://docs.microsoft.com/en-us/cpp / build / importing-data-using-declspec-dllimport? view = vs-2019 https://stackoverflow.com/a/4490536/7194773


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.