2012-07-23 14 views
5

Duplicar posible:
Windows & C++: extern & __declspec(dllimport)
Why/when is __declspec(dllimport) not needed?lo que hace __declspec (dllexport) hacer, cuando agregarlo antes de una función de importación

Quiero escribir un proyecto de DLL. Este proyecto incluye varios archivos DLL. Son dependiente. Defino algunas macros como sigue:

#ifdef MYDLL_DECL1 
    #define DLL_DECL __declspec(dllexport) 
#else 
    #define DLL_DECL __declspec(dllimport) 
#endif 

he definido MYDLL_DECL1 ... MYDLL_DECLn para cada módulo. Porque pensé que si definía la misma macro no funcionaría. Pero realmente quiero definir solo una macro, y escribí un testbed. Tengo dos módulos. En el archivo fuente del segundo moudle. Escribo código como sigue:

#define MYDLL_DECL 
#include "moudle1.h" 
#include "moudle2.h" 

Si utilizo el mismo nombre de la macro "MYDLL_DECL", para el archivo de la cabeza de modle1 he definido "MYDLL_DECL", por lo que "DLL_DECL" es igual a '__declspec (dllexport)'. En realidad, en el módulo2 debería ser igual a "__declspec (dllimport)", porque module2 import module1. Pero lo encontré funcionó cuando simplemente defino una misma macro para dos módulos. Y también me parece que el OpenCV también utiliza este MetWeck en su biblioteca

+2

... ¿Qué? Puede usar '__declspec (dllimport)' directamente sin necesidad de definir su propia macro! –

+4

http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed – Mohammad

+0

__declspec (dllimport) es un especificador de C/C++. Entonces puedo usar – Samuel

Respuesta

5

Primero, piensa en lo que necesitas sin la macro. Si se define una función de clase o en el módulo 1, debe declararlo __declspec(dllexport) en el módulo 1 y __declspec(dllimport) en todos los de los otros módulos. Incluyendo en el archivo de encabezado donde está declarado.

Puesto que usted no desea mantener dos archivos de cabecera diferentes, y usted no lo hace compilación condicional por todo el lugar, la mejor solución es utilizar una macro condicional definido, por ejemplo:

#ifdef MODULE1 
#define MODULE1_DECL __declspec(dllexport) 
#else 
#define MODULE1_DECL __declspec(dllimport) 
#endif 

Al invocar el compilador, solo define MODULE1 en el proyecto module1; no lo defines en ningún otro proyecto. Por lo tanto, al compilar module1, MODULE1_DECL se expande a __declspec(dllexport), y cuando compila cualquier otro módulo, se expande a __declspec(dllimport).

+0

También necesita definir MODULE1 ... MODULEn. Solo quiero definir solo una macro. Defino una macro para todos los módulos. Y funciona. Porque lo encontré cuando quiero importar otros dlls. No necesito el especificador __declspec (dllimport). – Samuel

+0

Hola James Kanze, ¿me puedes ayudar a reabrir esta pregunta? He modificado mi pregunta Ahora no es lo mismo que http://stackoverflow.com/questions/2288293/windows-c-extern-declspecdllimport y http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed – Samuel

+0

@Samuel No sé cómo funciona este foro, excepto que las cosas suceden arbitrariamente, por razones irracionales. Todo lo que puedo decir es que si no usa el especificador '__declspec (dllimport)', y los símbolos se importan de otra unidad de traducción, tendrá un comportamiento indefinido. Podría funcionar, para algunos tipos de símbolos, pero no puede contar con ello. –

Cuestiones relacionadas