Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Variables Globales Y Librerias Estáticas

Iniciado por tamat, 21 de Febrero de 2006, 06:35:03 PM

« anterior - próximo »

tamat

 A ver quien me echa un cable con esta estupidez:

Tengo una aplicacion que funcionaba perfectamente hasta que se me ocurrió separar lo que era aplicación de lo que es framework para meter este ultimo en una librería estática(.lib). Mi aplicacion linka contra ella y todo va bien salvo una cosa. Resulta que yo tengo una clase singleton que viene a ser un Factory encargada de contener "loaders" para los diferentes formatos. Esta clase ademas tiene una clase abstractar que sirve de interfaz para todos los loaders los cuales heredan de ella.

Tengo algunos loaders implementados y cuando mi aplicacion pide un archivo la factory mira que loader puede cargarlo y lo invoca.
Para indexar los loaders en el factory lo que hacía es simplemente tener una variable global del tipo del loader en el archivo que lo implementaba, de manera que al ejecutar se instanciaba automaticamente le loader y este desde el constructor se registraba en el factory.

Pero ahora al separar framework de aplicacion resulta que como esas variables no son invocadas desde mi aplicacion entonces al linkar no las considera utiles, no las incluye en mi ejecutable y por lo tanto no se instancian ni se registran por lo que no tengo loaders.

Una warrada que hice es llamar los loaders a mano desde mi aplicacion y entonces si que los añade y funciona.

Alguna idea para arreglar esto? algun consejo de programador experimentado?

Gracias

Por un stratos menos tenso

ALRAZ

 una funcion del tipo

mylib_init ()

suele ser necesaria para que tu librería/biblioteca haga todo lo que tiene que hacer, incluyendo inicializar singletones.

espero que sirva el consejo.

por cierto:
creo que tu variable global sigue estando ahí, solo que está en el .dll o .lib, no en el .exe

tamat

 Es lo que tenía pensado hacer, pero me da rabia porque me gustaba que bastase programar un modulo para que este se integrase en el sistema sin necesidad de que el sistema lo conociese.

Si, se que está en la LIB, pero al linkar el compilador no lo incluye en el exe así que como si no estuviese.
Por un stratos menos tenso

gdl

 ¿No hay la posibilidad de usar un #pragma o alguna opción del linker para que no te quite la variable?

jlennon75

 ¿has probado a realizar la declaración de la variable con el keyword extern?

tamat

 esto ultimo lo estuve intentando pero no me quedaba claro como hacerlo, poniendo extern "C" a secas no funcionaba pero nunca he tenido demasiado claro la funcion del extern "C", se supone que es para indicar al compilador que dicha variable estará declarada en el momento de linkar pero poco más, no?
Por un stratos menos tenso

Pogacha

 extern "C" quiere decir que es una declaración a una variable/función externa pero con declaración de C.
Las declaraciones de C llevan otras referencias internas distintas a las declaraciones de C++, por eso es necesario indicarlo. Si todo lo que has hecho es en C++ no necesitas especificar esto, solo usa extern .






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.