Saltar al contenido

vinculación dll inconsistente y definición de miembro de datos estáticos dllimport no permitido

Solución:

Espera que el compilador ignore un percance muy grave. Encontró el atributo __declspec (dllimport) en la declaración de la clase, que indica de manera bastante inequívoca que la implementación de la clase está presente en un módulo diferente que se enlazará en tiempo de ejecución. Pero luego también se encontró con la definición, completamente inesperada ya que el contrato de atributo dice que está compilado en un proyecto completamente diferente.

La advertencia C4273 se genera para recordarle que no está muy claro qué función se ejecutará realmente en tiempo de ejecución. Hay dos, uno que está ocupado compilando, otro en la DLL. Cual sera Realmente ejecutar es una suposición salvaje. C4273 es una advertencia de nivel 1, del tipo que se ajusta a la categoría “esto es casi seguro que no es correcto”. No es del todo imposible trabajar bien, ya que hay algunos expectativa de que las funciones tengan al menos el mismo código. Sin embargo, las probabilidades de que no causen problemas no son grandes, solo podría funcionar si la función no tiene efectos secundarios que cambien el estado interno de la DLL. Muy difícil de diagnosticar un error cuando lo hace por cierto.

Luego encontró la variable exportada. Mismo caso, hay dos de ellos. Aquí es donde el programador del compilador puso su pie en el suelo, hacer que el código use aleatoriamente uno u otro ya no es algo que se pueda ignorar. Eso simplemente no puede funcionar nunca, las variables no pueden tener el mismo valor. Entonces C2491 es un error grave.

No tengo idea de cómo se metió en este aprieto, claramente el camino que está tratando de viajar lo hará caer por un acantilado empinado.

La única forma en que puedo reproducir su problema es hacer lo siguiente:

  1. Cree un proyecto DLL de Win32, llámelo Proyecto 1
  2. Agregue el código fuente como lo describió
  3. Compile la DLL y LIB
  4. Cambiar las propiedades del proyecto para eliminar EXPORT de las definiciones del preprocesador
  5. Intente compilar nuevamente (luego veo sus errores / advertencias)

Si, en lugar de los pasos 4 y 5, hago lo siguiente, no veo ningún error:

Cree una aplicación de consola Win32, llámela Proyecto2

Agregue el código fuente de la siguiente manera:

#include "Project1.h"

#pragma comment(lib, "Project1.lib")

int _tmain(int argc, _TCHAR* argv[])
{
    ExportClass pClass;
    return 0;
}

Sospecho que ve esos errores porque está haciendo todo desde el mismo proyecto DLL y está sobrescribiendo el LIB que creó anteriormente y luego intentando importarlo.

Si estoy en lo cierto al adivinar lo que hizo, ¿puede intentar usar su DLL / LIB de otro proyecto y ver qué sucede?

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *