2011-03-17 14 views
10

que tienen una serie de advertencias que estoy tratando de arreglar la hora de construir gdcm utilizando Visual Studio 10 (versión de 32 bits):¿Cómo puedo solucionar esta advertencia de enlace dll inconsistente vs10?

4>..\..\..\..\gdcm\Utilities\gdcmexpat\lib\xmlparse.c(647): warning C4273: 'XML_ParserCreate' : inconsistent dll linkage 
4>   d:\src\gdcm\gdcm\utilities\gdcmexpat\lib\expat.h(206) : see previous definition of 'XML_ParserCreate' 

la función de llamada en sí parece:

XML_Parser XMLCALL 
XML_ParserCreate(const XML_Char *encodingName) 
{ 
    return XML_ParserCreate_MM(encodingName, NULL, NULL); 
} 

donde

#define XMLCALL __cdecl 

y

XMLPARSEAPI(XML_Parser) 
XML_ParserCreate(const XML_Char *encoding); 

donde

#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL 

y

#define XMLIMPORT __declspec(dllimport) 

Si estoy leyendo que correctamente, que significa que el enlace se __cdecl consistentemente a través derecha XMLCALL--? Porque, de ser así, ¿la advertencia es superflua o estoy malinterpretando esto?

Respuesta

16

No, se queja de que __declspec(dllimport) falta en la definición de la función pero está presente en la declaración de la función. Debería tomar esto en serio, no tiene sentido declarar la función importada de una DLL, pero también presente en su código. No puedes tenerlo de las dos maneras.

Esto generalmente es causado por la falta de #define. Editó las definiciones de macro, creo, pero cuando construye el archivo DLL generalmente especifica una macro en el comando de compilación (/ D). De modo que la declaración de la función usa dllexport en lugar de dllimport. Lo que asegura que la función se exporta de la DLL. El código de cliente usa el mismo archivo .h pero está construido sin esa macro definida. Ve la función declarada como dllimport.

Eche un vistazo más de cerca a la definición de macro XMLIMPORT, __declspec(dllexport) debe estar cerca. Otro diagnóstico es el conjunto de las funciones exportadas, visibles con Dumpbin.exe/exports. Deberían estar perdidos si adiviné correctamente.

+0

Eso fue ... que dllimport debería haber sido un dllexport. – mmr

+0

Guau, me perdí uno también con una variable que se exporta. En el encabezado, tenía algo así como 'COMMON_API extern const std :: string someStr;' mientras que en el archivo cpp tenía 'const std :: string someStr (" Background ");' al que le faltaba el especificador de exportación/importación. La macro API cambia los equipos en función de si el proyecto tiene una macro definida diciéndole que es una compilación dll o no. Tendré que vigilar este. – jxramos

Cuestiones relacionadas