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?
risposta
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
.
cerca _declspec (dllimport/export), sono sicuro che puoi trovare grandi spiegazioni. –
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. –
Perché è fuori programma? – littleadv