¿Qué significa realmente __declspec (dllimport)?


Respuestas:


118

__declspeces un atributo específico de Microsoft que le permite especificar información de clase de almacenamiento.
(El rincón de Nitpicker: Sin embargo, varios otros proveedores de compiladores, por ejemplo, GCC, ahora admiten esta extensión de lenguaje por compatibilidad con la base de código instalada que se escribió para los compiladores de Microsoft. Algunos incluso proporcionan atributos de clase de almacenamiento adicionales).

Dos de esos atributos de clase de almacenamiento que se pueden especificar son dllimporty dllexport. Indican al compilador que una función u objeto se importa o exporta (respectivamente) desde una DLL.

Más específicamente, definen la interfaz de la DLL para el cliente sin requerir un .DEFarchivo de definición de módulo ( ). A la mayoría de las personas les resulta mucho más fácil utilizar estas extensiones de idioma que crear archivos DEF.

Por razones obvias, __declspec(dllimport)y __declspec(dllexport)generalmente se emparejan entre sí. Se usa dllexportpara marcar un símbolo como exportado desde un archivo DLL y lo usa dllimportpara importar ese símbolo exportado en otro archivo.

Debido a esto, y debido a que generalmente se usa el mismo archivo de encabezado tanto al compilar la DLL como en el código del cliente que consume la interfaz de la DLL, es un patrón común definir una macro que se resuelve automáticamente en el especificador de atributo apropiado en tiempo de compilación. Por ejemplo:

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

Y luego marcando todos los símbolos con los que se deben exportar DLLEXPORT.

Presumiblemente, eso es lo que hace la Q_CORE_EXPORTmacro, resolviendo Q_DECL_IMPORTo Q_DECL_EXPORT.


__declspec no es correctamente "específico de MS" (es mucho más "específico del compilador") y algunos compiladores también usan esta declaración para múltiples plataformas. Algunos de los valores de los atributos son (dllexport / dllimports son específicos de MS, de hecho, ya que DLL es MS léxico)
Emilio Garavaglia

9
@Emilio: Hasta donde yo sé, Microsoft inventó la __declspecnotación como una extensión del lenguaje C ++. Creo que GCC ahora lo admite, pero eso es principalmente por razones de compatibilidad con los compiladores de Microsoft. Y no entiendo en qué se diferencia "específico de MS" de "específico del compilador". Microsoft escribió un compilador de C ++ y mucha gente lo usa. Viene con Visual Studio.
Cody Gray

8
Microsoft hace un compilador. Se llama "Compilador de optimización de Microsoft C / C ++", cl.exe. Mucha gente se refiere erróneamente a Visual Studio como si fuera un compilador, pero es un IDE. No sé por qué la gente es quisquillosa sobre lo que significa "específico de Microsoft". No significa un "entorno MS" (sea lo que sea), y ciertamente no significa "Windows". Sí, otros proveedores de compiladores ahora admiten la extensión para compatibilidad con la base instalada de código escrito dirigido a compiladores de Microsoft. Como dije antes, hasta donde yo sé, Microsoft inventó la sintaxis. Ese es el punto aquí.
Cody Gray

2
@CodyGray: que Microsoft lo haya inventado por sí solo no sería suficiente. Sin embargo, al haberlo inventado Microsoft, no hay ningún estándar que lo contenga, otros solo lo implementan por compatibilidad y se usa principalmente (si no exclusivamente) para programas dirigidos a Microsoft Windows juntos, lo que hace un punto muy fuerte para llamarlo "específico de Microsoft"
celtschk

6
Esta es una respuesta asombrosa, especialmente la parte sobre "porque el mismo archivo de encabezado generalmente se usa tanto al compilar la DLL como en el código del cliente". Hace que todos los aspectos de la importación / exportación sean muy claros.
Ela782

30

__declspec(dllimport) es un especificador de clase de almacenamiento que le dice al compilador que una función, objeto o tipo de datos está definido en una DLL externa.

La función, el objeto o el tipo de datos se exporta desde una DLL con su correspondiente __declspec(dllexport).


6
Okay. Finalmente, después de 2 horas de lectura, encontré la declaración más satisfactoria, más concisa y precisa de lo que quiero.
el psy Congroo

1

__declspec(dllexport)le dice al compilador que informe al enlazador que estos símbolos deben colocarse en la tabla de exportación (al compilar el .dll). Al compilar el programa que se vincula con el .dll, __declspec(dllimport)le dice al compilador que produzca una llamada indirecta indirecta de registro absoluto relativa a rip (que el enlazador completará para apuntar a la tabla de importación) en lugar del registro directo directo relativo a rip habitualinstrucción de llamada indirecta a una función indefinida (que, como no puede modificar la instrucción, el enlazador inserta la dirección relativa de un procesador y luego crea el procesador, dentro del cual coloca la llamada indirecta indirecta del registro absoluto relativo de rip a la puntero de función en la tabla de importación). Este es un tamaño de código y una optimización de velocidad. Es la biblioteca de importación .lib la que le dice al enlazador qué símbolos se importarán y se usa como guía para crear la tabla de importación y crear los procesadores necesarios en el 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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.