Acerca del enlace dll inconsistente


¿Cómo puedo eliminar esta advertencia de enlace? Puede ver el segmento de código que causa esta advertencia.

static AFX_EXTENSION_MODULE GuiCtrlsDLL = { NULL, NULL };
//bla bla
// Exported DLL initialization is run in context of running application
    extern "C" void WINAPI InitGuiCtrlsDLL()
    {
     // create a new CDynLinkLibrary for this app
      new CDynLinkLibrary(GuiCtrlsDLL);
     // nothing more to do
    }

Advertencia C4273: 'InitGuiCtrlsDLL': inconsisten t enlace dll

También tengo definiciones de exportación e importación, como:

#ifdef _GUICTRLS
   #define GUI_CTRLS_EXPORT __declspec(dllexport)
#else
   #define GUI_CTRLS_EXPORT  __declspec(dllimport)
#endif
Author: genpfault, 2010-04-07

6 answers

Hay múltiples posibilidades:

1) static AFX_EXTENSION_MODULE GuiCtrlsDLL = { NULL, NULL };

Se usa AFX_EXTENSION_MODULE. Esto significa que está implementando una DLL de extensión MFC. Para tales extensiones DLL debe definir el preprocesador _AFXEXT. Establezca esto en la configuración del compilador de C++ de su proyecto de Visual C++

Véase:

Cómo usar _declspec (dllexport) en una DLL de extensión MFC: http://support.microsoft.com/kb/128199

(Actualmente no puedo publicar más de 1 enlace porque mi la reputación es inferior a 10. Añadiré 2 enlaces más importantes más adelante. Entonces, si esta es la solución, márquela como respuesta para acelerar el proceso;))

Como se prometió, aquí están los dos enlaces:

AFX_EXTENSION_MODULE Estructura: http://msdn.microsoft.com/en-us/library/sxfyk0zk.aspx

TN033: Versión DLL de MFC: http://msdn.microsoft.com/en-us/library/hw85e4bb.aspx

2) Es probable que tenga una definición/declaración duplicada.

 17
Author: Gökhan Akca,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-19 13:17:26

El propósito de las declaraciones del preprocesador:

#ifdef _GUICTRLS 
   #define GUI_CTRLS_EXPORT __declspec(dllexport) 
#else 
   #define GUI_CTRLS_EXPORT  __declspec(dllimport) 
#endif 

Es asegurarse de que el archivo de cabecera declara la clase o función como _ _ declspec (dllexport) en el .dll donde está definido, y como __declspec(dllimport) para cualquier otro .dll que podría querer usarlo.

Para que esto funcione, se deben definir _GUICTRLS al compilar la exportación .dll, y no definido para ningún otro .DLL. Generalmente se esperaría que _GUICTRLS se definiera en las propiedades del proyecto, bajo C / C++ - > Preprocesador - > Definiciones de Preprocesador.

El error del compilador que está viendo generalmente ocurre porque _GUICTRLS no está definido para el proyecto que está haciendo la exportación, o está definido para varios proyectos, generalmente como resultado de cortar un pegado de un proyecto a otro. También verá esto si _GUICTRLS está definido en un archivo de encabezado que se incluye en varios proyectos.

 37
Author: Eric Thompson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-12 20:33:36

Esta advertencia suele ser causada por una definición duplicada de una función con un uso diferente de dllimport. ¿Seguro que no hiciste esto?

 2
Author: Matteo Italia,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-07 13:50:15

[Enlace dll inconsistente de CMake]

Encontré el siguiente problema + solución con el __declspec(dllexport) + _ _ declspec(dllimport) :

# # #CMakeLists.txt
add_defintions(-DMYLIB=1)
# The above was the solution...
#    (MYLIB is used in the standard ifdef + define MYLIB_EXPORT syntax)
#  Below: seems to get overruled by other directory's headers: 
set_source_files_properties(  file1.h  file2.h  COMPILE_FLAGS "-DMYLIB=1") 

Esto fue molesto porque varias fuentes dicen que se use el comando 'set source file properties' para obtener una mejor granularidad, pero el documento no está claro qué sucede con file1.h declara cuando se incluye desde un directorio diferente... ¡mejor seguir con add_definitions( -DMYLIB=1 ) por ahora!

Para atrapar este problema: en tu Foo.archivo cpp:

#include "export.h"
#if defined(MYLIB)
#if defined(OTHERLIB)
  static_assert(0,"error, check your definitions!");
  // OTHER depends on MY; can't have both of these flags being set!
#endif
#endif
struct  OTHER_EXPORT  foo 
{ 
};
 1
Author: peter karasev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-09-03 07:35:21

Además de leer el mensaje de advertencia, preste atención a dónde ocurre si tiene varios proyectos como parte de un espacio de trabajo.

Perdí el tiempo buscando un problema en mi DLL que estaba compilando y enlazando correctamente. El espacio de trabajo también estaba construyendo la aplicación principal y mi error fue que inadvertidamente había incluido un nuevo archivo fuente (DLL) en la lista de archivos de compilación de la propia aplicación.

El programa principal requiere el encabezado DLL mynewdll.h para importar cosas pero no requiere el archivo fuente mynewdll.cpp. (El código se introduce en tiempo de ejecución con una DLL.) Tengo la costumbre de incluir archivos de encabezado y código en los proyectos como un par, y aquí es donde me había equivocado.

Habría detectado el error mucho antes si hubiera estado alerta y notado que el proyecto DLL se vinculó sin errores y fue el programa principal el que se quejó!

Mi código fuente DLL y proyecto estaba libre de errores y fue sólo la forma en que traté de construir mi ejecutable que era defectuoso.

 1
Author: user3070485,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-23 08:33:16

Vea que no está definiendo los símbolos exportados en un proyecto diferente. También limpie todos los archivos intermedios a mano y recompile.

 0
Author: damian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-16 08:35:19