Pregunta

Tengo el siguiente problema: Mi (C ++ -) proyecto consiste en varios sub-proyectos. En cada uno, tengo varios archivos con código que desea ejecutar en el arranque. Mi solución hasta el momento es el uso de variables estáticas que requieren el código correspondiente en la inicialización de la siguiente manera:

// Foo.cpp

static TFooRegistry sFooRegistry;   // does stuff in constructor.

Cuando la construcción de mi proyecto usando DLL para cada subproyecto, todo funciona bien y el código se ejecuta como se esperaba. Al vincular los proyectos parciales de forma estática, sin embargo, el enlazador determina que foo.o no contiene ningún código cada vez que se hace referencia desde el exterior y optimiza la basura. Por supuesto que podría agregar una referencia a sFooRegistry en otro lugar, pero esto es tedioso y propenso a errores.

¿Qué (conformant estándar) formas de resolver este hay?

OK, ¿qué puedo hacer en mac / gcc y ganar estudio / visual?

¿Fue útil?

Solución

No hay maneras conformes estándar de obligar a los objetos en las bibliotecas para ser inicializado - usted tiene que utilizar trucos dependiendo de la plataforma (s) en particular. La diferencia entre una y DLL y una biblioteca estática (en Windows, por lo menos) es que la primero tiene puesta en marcha y parada de la código que es ejecutado por el sistema operativo, mientras que el último es sólo una concatenación de ficheros objeto.

Además, el enlazador no es la optimización de su puesta en marcha distancia de código - que simplemente no es la vinculación de ella, ya que al parecer nunca se utiliza. enlazadores bestias son bastante estúpidos - si usted quiere saber cómo hacen lo que hacen, miren en el libro enlazadores y Cargadores .

Otros consejos

Algunos truco, pero revisarlo. Para el sistema de victorias (pero no linux) utiliza dllexport explícita - en este caso, enlazador Doe no sabe si este símbolo utilizado por la aplicación externa o no

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top