Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problemas con librerías estaticas/dinamicas

Iniciado por KILE, 01 de Enero de 1970, 01:00:00 AM

« anterior - próximo »

KILE

                                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                                

samsaga2

                                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.                                

KILE

                                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:                                

samsaga2

                                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.

                               

KILE

                                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                                

KILE

                                Perdon por la expresion X'DDD                                

samsaga2

                                Como obtienes el puntero desde el main y como lo desde el KSysWin32?
                               

KILE

                                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:                                

synchrnzr

                                ¿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:                                

KILE

                                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                                

synchrnzr

                                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 ]                                

synchrnzr

                                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:
                               

KILE

                                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                                






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.