2012-06-05 19 views
7

He estado buscando este término "exportando un símbolo". ¿Qué significa exportar un símbolo en C/C++ o con respecto a las bibliotecas (compartido/estático)? ¿De dónde exportamos los símbolos y por qué? ¿Cuál es la relación de exportar un símbolo con el nombre que se fragmenta por el compilador?¿Qué significa exportar un símbolo?

+0

busque _declspec (dllimport/export), estoy seguro de que puede encontrar grandes explicaciones. –

+2

Además, la pregunta no fue downvoted porque era un duplicado, pero probablemente porque SO lo sugirió de los duplicados e ignoró las sugerencias. –

+1

¿Por qué es offtopic? – littleadv

Respuesta

16

Exportar un símbolo significa "publicitar" su existencia en su archivo de objeto/biblioteca y dónde está, de modo que pueda ser importado (= vinculado a) por otros módulos.

El enlace puede hacerse estática o dinámicamente, pero de cualquier forma el enlazador debe saber qué es el símbolo y dónde está, y el símbolo exportado y el símbolo importado deben coincidir para que ocurra. El mapeo de nombres está relacionado con eso (el mapeo de nombres de C++ incluye la definición de tipo de símbolo en el nombre del símbolo, y el reordenamiento del símbolo exportado e importado debe coincidir para que el enlazador vincule correctamente la importación-exportación).


Ejemplo:

Suponga que tiene una biblioteca "STANDARDC" (nombre aleatorio) y su SOMEPROG programa. El programa SOMEPROG necesita imprimir en la consola, por lo que llamará al printf. Pero en realidad no implementa printf en su programa SOMEPROG, simplemente lo usa (= lo importa), mientras que la implementación está en otra parte.

La biblioteca STANDARDC tiene una lista de símbolos que exporta, que incluye todas las funciones que se implementan en esa biblioteca y se pueden llamar desde el exterior (= funciones exportadas). printf es una de esas funciones, por lo que aparecerá en la lista exportada.

El compilador pasa por su SOMEPROG.C y ve que hace referencia a printf, pero no hay implementación para él. El compilador agrega el printf a la lista de símbolos importados para el SOMEPROG.obj resultante, para que el enlazador vincule la implementación real en.

El vinculador toma su archivo SOMEPROG.obj y el archivo .lib STANDARDC y ve qué funciones se usan en el SOMEPROG.obj. El vinculador encuentra que printf no está implementado, se importa, por lo que el vinculador examina todos los archivos .lib que tiene y encuentra el printf correspondiente en la lista exportada de STANDARDC. Se necesita la implementación de printf de STANDARDC y la vincula a su programa donde quiera que haga referencia al símbolo importado printf.

+1

puede explicar con el ejemplo. ¿Por qué deseo exportar mi símbolo? – Raulp

+1

@softy agregó un ejemplo. – littleadv

Cuestiones relacionadas