• Jueves 14 de Noviembre de 2024, 04:28

Autor Tema:  Miembro Static En Una Dll  (Leído 2697 veces)

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Miembro Static En Una Dll
« en: Miércoles 27 de Diciembre de 2006, 13:18 »
0
Hola

Aqui estoy de nuevo dando la lata con las dll. Con tanto quebradero de cabeza creo que le he encontrado otro significado a la expresion "dll´s Hell"   :devil:

El caso es que quiero poner unas variables static dentro de una clase, pero al modificar el valor de alguna de esas variables en un metodo de una clase hija me da este error de linkado

Citar
SMRprisma.obj : error LNK2001: unresolved external symbol "public: static int SMRcolision::indiceArista" (?indiceArista@SMRcolision@@2HA)
Debug/SMR.dll : fatal error LNK1120: 1 unresolved externals

... si no modifico la variable static no me da error.

Si alguien sabe a que se debe esto ... gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Miembro Static En Una Dll
« Respuesta #1 en: Miércoles 27 de Diciembre de 2006, 14:14 »
0
¿Esta inicializada? No solo hay que definirla en la clase sino afuera.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.


Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Miembro Static En Una Dll
« Respuesta #3 en: Miércoles 27 de Diciembre de 2006, 15:33 »
0
De nadas  :comp:

PD. Agrego que esto no es una particularidad de las DLLs.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Miembro Static En Una Dll
« Respuesta #4 en: Martes 2 de Enero de 2007, 13:52 »
0
Aqui estoy de nuevo, año nuevo dudas nuevas

El problema que tengo ahora si tiene que ver creo con las dll

Hice lo siguiente

Código: Text
  1. // en el .h
  2.  
  3. class A
  4. {
  5.  public:
  6. ...
  7. static int myVar;
  8. }
  9.  
  10. // en el cpp
  11.  
  12. int DLL_API A::myVar = 0;
  13.  
  14. // DLL_API es el macro de exportacion
  15.  

No me habia dado cuenta del problema por que no habia usado la dll desde entonces. Resulta que al acceder a la dll inmediatamente salta un access violation 0xC0000005 , cosa que no pasa si retiro las variables static, asi que supongo que estaran mal exportadas.

Alguien tiene idea de como solucionar esto

gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Miembro Static En Una Dll
« Respuesta #5 en: Martes 2 de Enero de 2007, 14:43 »
0
Cita de: "Diodo"
Resulta que al acceder a la dll inmediatamente salta un access violation 0xC0000005 , cosa que no pasa si retiro las variables static, asi que supongo que estaran mal exportadas.
¿Que queres decir con acceder a la DLL? ¿Cargarla en memoria o acceder a esa variable estatica? Depura el ejecutable para ver que instruccion es la causante del problema ... supongo que estas usando enlazado estatico ...

¿Que es DLL_API? ¿__declspec(dllexport)? ¿Te compila ese codigo? Proba con:

Código: Text
  1.  
  2. static int DLL_API myVar;
  3.  
  4.  

En la clase ... sino deberia darte error al compilar ...

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Miembro Static En Una Dll
« Respuesta #6 en: Martes 2 de Enero de 2007, 15:38 »
0
Citar
¿Que queres decir con acceder a la DLL? ¿Cargarla en memoria o acceder a esa variable estatica? Depura el ejecutable para ver que instruccion es la causante del problema ... supongo que estas usando enlazado estatico ...

Supongo que sera cuando carga la dll en memoria, por que desde la aplicacion no instancio a la variable estatica , ademas al debuggear no me lleva a codigo de la dll, me da el access violation y luego me da otro error de access violation en ntdll.dll que es donde se para el debugger

Citar
¿Que es DLL_API? ¿__declspec(dllexport)? ¿Te compila ese codigo? Proba con:

static int DLL_API myVar;

Si es:

#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif

No me deja declarar exportables dentro de una clase exportable:

Citar
member of dll interface class may not be declared with dll interface

por eso probe a ponerlo fuera en el cpp, pero parece que no se lo trago ...

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Miembro Static En Una Dll
« Respuesta #7 en: Martes 2 de Enero de 2007, 15:50 »
0
Bueno creo que he acotado un poco mas el problema. Segun lo que puse antes para variables int por ejemplo estaria bien, el problema lo dan otras variables static que son clases al ponerlas como NULL (tb probe con 0) :

SMRpunto3D SMR_API SMRcolision::puntoContacto=NULL // da fallo
SMRpunto3D SMR_API SMRcolision::puntoContacto=SMRpunto3D(0.0,0.0,0.0); // no da fallo de momento.

De todas maneras no se cual es la problematica de inicializarlas a NULL

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Miembro Static En Una Dll
« Respuesta #8 en: Martes 2 de Enero de 2007, 16:29 »
0
Cita de: "Diodo"
Supongo que sera cuando carga la dll en memoria, por que desde la aplicacion no instancio a la variable estatica , ademas al debuggear no me lleva a codigo de la dll, me da el access violation y luego me da otro error de access violation en ntdll.dll que es donde se para el debugger
Tenes que ver la pila de llamadas para identificar de donde proviene el error.

Cita de: "Diodo"
SMRpunto3D SMR_API SMRcolision::puntoContacto=NULL // da fallo
SMRpunto3D SMR_API SMRcolision::puntoContacto=SMRpunto3D(0.0,0.0,0.0); // no da fallo de momento.

¿¿SMRpunto3D es un puntero?? La verdad es que no entiendo como pueden compilar esas dos lineas al mismo tiempo ... lo primero no deberia compilar a menos que fuera un puntero y lo segundo no deberia compilar con un puntero ...

PD. NULL es 0  :P

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Miembro Static En Una Dll
« Respuesta #9 en: Martes 2 de Enero de 2007, 16:37 »
0
Citar
Tenes que ver la pila de llamadas para identificar de donde proviene el error.

Soy un inculto en esas lides, ¿como se mira?

Citar
¿¿SMRpunto3D es un puntero?? La verdad es que no entiendo como pueden compilar esas dos lineas al mismo tiempo ... lo primero no deberia compilar a menos que fuera un puntero y lo segundo no deberia compilar con un puntero ...

SMRpunto3D es la llamada al constructor de la clase de igual nombre SMRpunto3D

No tienen que compilar al mismo tiempo en la primera, es lo que queria hacer, pero me da error al inicializar a NULL, la segunda es como arregle el error, llamando al constructor que crea un SMRpunto3D de coordenadas (0,0,0)

Citar
PD. NULL es 0 

Si pero no se donde lei que podia dar problemas el inicializar a NULL en c++ y que era mejor inicializar a 0, por eso probe ...

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Miembro Static En Una Dll
« Respuesta #10 en: Martes 2 de Enero de 2007, 17:40 »
0
Cita de: "Diodo"
Soy un inculto en esas lides, ¿como se mira?

No me acuerdo de memoria pero busca el menu de depuracion y hay una ventana que se llama asi o si esta en ingles call stack.

Cita de: "Diodo"
SMRpunto3D es la llamada al constructor de la clase de igual nombre SMRpunto3D

Por eso, la primera linea no puede compilar al estar tratando de transformar un int (NULL que es 0) a una clase ...

Cita de: "Diodo"
Si pero no se donde lei que podia dar problemas el inicializar a NULL en c++ y que era mejor inicializar a 0, por eso probe ...

Como dicen ustedes: chorradas.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Diodo

  • Moderador
  • ******
  • Mensajes: 658
    • Ver Perfil
    • http://www.solocodigo.com
Re: Miembro Static En Una Dll
« Respuesta #11 en: Martes 2 de Enero de 2007, 17:51 »
0
Citar
Por eso, la primera linea no puede compilar al estar tratando de transformar un int (NULL que es 0) a una clase ...

Es verdad, no habia caido, de cualquier forma compilar si que compila y tampoco arroja ningun warning

Gracias

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Miembro Static En Una Dll
« Respuesta #12 en: Martes 2 de Enero de 2007, 17:57 »
0
Cita de: "Diodo"
Es verdad, no habia caido, de cualquier forma compilar si que compila y tampoco arroja ningun warning

Gracias
No se como lo compila pero si lo hace no me extraña que falle  :P

Me imagino que lo podes hacer asi tranquilamente:
Código: Text
  1.  
  2. SMRpunto3D SMR_API SMRcolision::puntoContacto;
  3.  
  4.  

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.