2012-06-05 4 views
7

Ho cercato questo termine "esportare un simbolo". Cosa significa esportare un simbolo in C/C++ o rispetto alle librerie (condivise/statiche)? Da dove esportiamo i simboli e perché? Qual è la relazione di esportare un simbolo con il nome mangling dal compilatore?Che cosa significa esportare un simbolo?

+0

cerca _declspec (dllimport/export), sono sicuro che puoi trovare grandi spiegazioni. –

+2

Inoltre, la domanda non è stata downvoted perché era un duplicato, ma probabilmente perché vi era stato suggerito da SO dei duplicati e avete ignorato i suggerimenti. –

+1

Perché è fuori programma? – littleadv

risposta

16

L'esportazione di un simbolo significa "pubblicizzare" la sua esistenza nel file oggetto/libreria e dove si trova, in modo che possa essere importata (= collegata a) da altri moduli.

Il collegamento può essere eseguito in modo statico o dinamico, ma in entrambi i casi il linker deve sapere qual è il simbolo e dove si trova e il simbolo esportato e il simbolo importato devono corrispondere affinché ciò avvenga. Il mangling del nome è correlato a quello (il mangling del nome C++ include la definizione del tipo di simbolo nel nome del simbolo e il mangling del simbolo esportato e importato deve corrispondere affinché il linker colleghi correttamente l'importazione-esportazione).


Esempio:

Supponiamo di avere una biblioteca "STANDARDC" (nome a caso) e il vostro SOMEPROG programma. Programma SOMEPROG deve stampare su console, quindi chiamerà printf. Ma in realtà non si implementa printf nel programma SOMEPROG, lo si usa (= importa), mentre l'implementazione è altrove.

La libreria STANDARDC ha una lista di simboli che esporta che include tutte le funzioni implementate in quella libreria e che possono essere richiamate dall'esterno (= funzioni esportate). printf è una di queste funzioni, quindi verrà visualizzata nell'elenco esportato.

Il compilatore passa attraverso SOMEPROG.C e vede che si fa riferimento a printf, ma non c'è implementazione per esso. Il compilatore aggiunge printf all'elenco dei simboli importati per SOMEPROG.obj risultante, affinché il linker colleghi l'implementazione effettiva in.

Il linker prende il file SOMEPROG.obj e il file .LIB STANDARDC e vede quali funzioni sono utilizzate in SOMEPROG.obj. Il linker rileva che printf non è implementato, è importato, quindi il linker controlla tutti i file .lib che ha e trova la corrispondenza dello printf nell'elenco esportato di STANDARDC. Prende l'implementazione di printf da STANDARDC e la collega al tuo programma ovunque tu faccia riferimento al simbolo importato printf.

+1

puoi spiegare con l'esempio. Perché voglio esportare il mio simbolo? – Raulp

+1

@softy ha aggiunto un esempio. – littleadv