Vi el código fuente de Qt así:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
Qué Q_CORE_EXPORT
macro define como a continuación:
define Q_DECL_IMPORT __declspec(dllimport)
Entonces, ¿qué significa __declspec(dllimport)
realmente?
Vi el código fuente de Qt así:
class Q_CORE_EXPORT QBasicAtomicInt
{
public:
...
};
Qué Q_CORE_EXPORT
macro define como a continuación:
define Q_DECL_IMPORT __declspec(dllimport)
Entonces, ¿qué significa __declspec(dllimport)
realmente?
Respuestas:
__declspec
es 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 dllimport
y 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 .DEF
archivo 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 dllexport
para marcar un símbolo como exportado desde un archivo DLL y lo usa dllimport
para 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_EXPORT
macro, resolviendo Q_DECL_IMPORT
o Q_DECL_EXPORT
.
__declspec
notació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.
__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)
.
__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
Significa que la definición de la función está en una biblioteca dinámica. Consulte la documentación para obtener más detalles y ejemplos.