Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: KILE en 01 de Enero de 1970, 01:00:00 AM

Título: Problemas con librerías estaticas/dinamicas
Publicado por: KILE en 01 de Enero de 1970, 01:00:00 AM
                                Me cierran la academia así q os posteo lo mismo q puse en flipcode, si alguien no lo entiende lo posteo luego en español. Sorry :riendo:

Hi all, I have some problem working with static/dynamic libraries. First of all, I'm develop an engine which consist
in three different modules:

- KSysWin32: Static library that implement System dependent functions (File access, memory allocate,...)
- K3DEngine: Static library used for 3D stuff like octrees, bsp, geometry, models, ...
- KRendOGL: Dynamic Library (DLL but without generating .lib, for runtime load). That implement a render interface.

The problem is that in my first program I link this one with KSysWin32.lib K3DEngine.lib and then in runtime I load
the KRendOGL.DLL. I have one "IRender *Render" defined in main.cpp that point to the class implements in KRendOGL.dll.
And then in my K3DEngine.lib I also used this interface (Writing "extern IRender *Render"). The problem cames when I
make a call (from my main program) to a function implemented in KSysWin32.lib that use Render. For example

(main)
  Octree->Render();

(KSysWin32)
Octree::Render()
{
   Render->DrawFaces();
}


(KRendOGL.DLL)
Render::DrawFaces()
{
...
}


Appears the following error message:
"The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared
with one calling convention with a funtion pointer declared with a different calling convention"


Ah, by note, if I make the following, this run oks.

(main)
   Render->DrawFaces();

(KRendOGL.DLL)
Render::DrawFaces()
{
...
}


So the problem is to use an extern pointer to the Render interface. How I can make this one? :_(
Thanks to all                                
Título: Problemas con librerías estaticas/dinamicas
Publicado por: samsaga2 en 01 de Enero de 1970, 01:00:00 AM
                                Parece ser un problema de compilado. A mi me pasaba cuando usaba punteros a funciones desde C++ a C porque la forma de llamar a las funciones es diferente. Dices que el problema lo tienes al llamar desde el main a una función en KSysWin32, pues lo primero que deberias comprovar son los parámetros de compilación/linkage que sean diferentes en la fuente del main y la del KSysWin32 además de mirarte la ayuda buscando alguna opción que puede afectar al formato de llamadas de funciones. Casi seguro que es eso porque se queja de la pila no se guarda de la misma forma entre llamadas a funciones.                                
Título: Problemas con librerías estaticas/dinamicas
Publicado por: KILE en 01 de Enero de 1970, 01:00:00 AM
                                No a ver, si desde el programa principal llamoa KSysWin32 o a K3DEngine va todo bien, SIEMPRE Y CUANDO ninguna funcion de las que llame use llamadas a la DLL que he cargado.
Por ponerte un ejemplo.
Si en el main inicializo dinamicamente la librería KRENDOGL.DLL y lleno una variable global llamada IRender *pRender que es la que implementa las funcion del render (BeginFrame, EndFrame, Draw...) el problema viene cuando desde las otras dos librería, concretamente desde la K3DEngine hago una llamada a pRender->BeginFrame() (Estando pRender declarado en esa librería como extern IRender *pRender). Si hago una llamada a K3DEngine sin que use el pRender va todo bien y si hago una llamada desde el main a pRender tambien, el problema es al llamar a la variable global pRender desde otra librería que no sea el main. Un poco lioso no? :ojo:                                
Título: Problemas con librerías estaticas/dinamicas
Publicado por: samsaga2 en 01 de Enero de 1970, 01:00:00 AM
                                Uff, a ver si me aclaro
Tienes:
- una función main
- una librería de funciones K3DEngine estática que no es más que un wrapper (hablando de renderizado)
- y la que hace todo el trabajo de renderizado KRendOGL que es la librería dinámica

Cuando llamas desde el main al K3DEngine, no problemo. Cuando llamas desde el main al KRenderOGL, no problemo tampoco. El problema es cuando llamas desde K3DEngine a KRenderOGL, ¿no?

Está más compilado de lo que parecía. Es un poco raro, porque si puedes llamar desde el main a cualquiera de las dos librerias tendría que significar que el formato de las llamadas es igual para todos, pero se queja de que las llamadas desde K3DEngine hacia KRenderOGL no son del mismo formato :, muy raro.

El fallo tiene que estar en K3DEngine, como antes digo que tiene que ser algo del compilado porque de eso se queja. Así que tendrías que comprovar las diferencias de compilación entre K3DEngine y sus otros dos parientes. Pero aún así no me acaba de cuadrar.

La solución definitiva es hacer el debug con el código en ensamblador, asi sabrás exactamente como se llama las funciones. Haz un debug mixed con el código fuente y el ensamblador.

                               
Título: Problemas con librerías estaticas/dinamicas
Publicado por: KILE en 01 de Enero de 1970, 01:00:00 AM
                                Joder pero es que no creo que sea tan dificil no?, es que no se ya si el problema es por llamar desde la librería K3DEngine a la DLL que he cargo dinamicamente o por usar un extern que al fin y al cabo es un puntero a la interfaz de render :___(
vaya mierda gorda                                
Título: Problemas con librerías estaticas/dinamicas
Publicado por: KILE en 01 de Enero de 1970, 01:00:00 AM
                                Perdon por la expresion X'DDD                                
Título: Problemas con librerías estaticas/dinamicas
Publicado por: samsaga2 en 01 de Enero de 1970, 01:00:00 AM
                                Como obtienes el puntero desde el main y como lo desde el KSysWin32?
                               
Título: Problemas con librerías estaticas/dinamicas
Publicado por: KILE en 01 de Enero de 1970, 01:00:00 AM
                                En el main principal se lo paso por referencia a la dll y me lo llena bien, y luego en las libs lo pillo con extern de todas formas lo he traceado y no cambia su valor sigue siendo el mismo :triste:                                
Título: Problemas con librerías estaticas/dinamicas
Publicado por: synchrnzr en 01 de Enero de 1970, 01:00:00 AM
                                ¿Linkas el KRendOGL.lib cuando compilas la KSysWin32.dll? Creo que es conveniente.

De todas formas no quiero liarme mucho en el tema, que estas cosas son complicadillas. Lo sé pq mi motor de sonido va a DLLs también y he sudado un montón pa que funcione todo ^_^'

Sync :guay:                                
Título: Problemas con librerías estaticas/dinamicas
Publicado por: KILE en 01 de Enero de 1970, 01:00:00 AM
                                No sync no linko la .lib de ahi que sea DLL dinámica y no estática (Vamos yo llamo DLL dinámica a las que cargas en runtime y DLL estática a la que incluyes el .lib) y para hacer este tipo de cosas, interfaces de renders, plugins, etc... no se suele poner la .lib como es logico :ojo:

Un saludo                                
Título: Problemas con librerías estaticas/dinamicas
Publicado por: synchrnzr en 01 de Enero de 1970, 01:00:00 AM
                                Pues no te puedo aportar mucho más. La DLL de mi motor de sonido se vincula también a tiempo real, como tú dices, pero sigue siendo imprescindible compilar el ejecutable que la tiene que utilizar con la LIB...

Bueno, para mi una DLL es dinámica cuando se vincula a tiempo real y no la integras en el ejecutable ^_^

Sync :guay:

[ Este Mensaje fue editado por: synchrnzr el 2002-06-17 10:43 ]                                
Título: Problemas con librerías estaticas/dinamicas
Publicado por: synchrnzr en 01 de Enero de 1970, 01:00:00 AM
                                Ah, ok, ya pillo el matiz. La llamas dinámica cuando la cargas en un punto arbitrario durante la ejecución del programa con alguna función a tal efecto y no cuando cargas el programa en sí, ¿verdad? Ya me ha costado pillarlo XDDD

Pos nada, entonces sí es como tú dices y no te puedo ayudar :triste:
                               
Título: Problemas con librerías estaticas/dinamicas
Publicado por: KILE en 01 de Enero de 1970, 01:00:00 AM
                                Pues nada ya me ha funcionado, :sonriendo: cogi lo borre todo y empecé desde el principio y nada ya furula :riendo: jejej si es que soy mu cutre depurando X'DD