2011-01-10 7 views
5

estoy tratando de escribir un archivo DLL, así es como se ve mi archivo de cabecera:dllimport procedimiento

#ifndef _DLL_H_ 
#define _DLL_H_ 

#if BUILDING_DLL 
# define DLLIMPORT __declspec (dllexport) 
#else /* Not BUILDING_DLL */ 
# define DLLIMPORT __declspec (dllimport) 
#endif /* Not BUILDING_DLL */ 


DLLIMPORT void HelloWorld (void); 


#endif /* _DLL_H_ */ 

En el archivo .cpp incluyo este archivo de cabecera, y trato de declarar un procedimiento de importación DLL de esta manera :

DLLIMPORT void HelloWorld() 
{ 
    MessageBox (0, "Hello World from DLL!n", "Hi", MB_ICONINFORMATION); 
} 

Pero el compilador (he mingw32 en windows 7 64 bits) sigue mostrándome este error:

E:\Cpp\Sys64\main.cpp|7|error: function 'void HelloWorld()' definition is marked dllimport| 
E:\Cpp\Sys64\main.cpp||In function 'void HelloWorld()':| 
E:\Cpp\Sys64\main.cpp|7|warning: 'void HelloWorld()' redeclared without dllimport attribute: previous dllimport ignored| 
||=== Build finished: 1 errors, 1 warnings ===| 

Y no entiendo por qué.

+0

He fusionado sus dos cuentas, por lo que debería poder aceptar una respuesta ahora. –

Respuesta

3

El declspec(dllimport) genera entradas en la tabla de importación de módulos del módulo. Esta tabla de importación se utiliza para resolver las referencias a los símbolos en el momento del enlace. En el momento de la carga, estas referencias son corregidas por el cargador.

El declspec(dllexport) genera entradas en la tabla de exportación DLL de la DLL. Además, necesita implementar símbolos (función, variables) que declaren con él.

Dado que implementa la DLL, debe definir BUILDING_DLL. Esto podría hacerse con #define, pero esto debería establecerse mejor en la configuración del proyecto.

+1

O pase '/ D BUILDING_DLL' al compilador (que creo que es la opción más común) – MSalters

+0

Tiene razón. Agregó esto a la respuesta. – harper

2

Tuve exactamente el mismo error antes de darme cuenta de que en realidad no definí BUILDING_DLL.

Por lo tanto, DLLIMPORT se definió como __declspec (dllimport) y no __declspec (dllexport) como estaba previsto. Después de definir el símbolo, el problema fue resuelto.

Ya que estás en MinGW, que necesita para aprobar el siguiente:

-DBUILDING_DLL 

como una opción del compilador, o simplemente añadir

#define BUILDING_DLL 

en la parte superior de su archivo. El primero es mejor, solo use la solución #define si no puede encontrar la forma de pasar la opción -DBUILDING_DLL a gcc.

Cuestiones relacionadas