c++ linker static-initialization

c++ - ¿Cómo evitar que el enlazador optimice el código de inicio ausente?



linker static-initialization (2)

Tengo el siguiente problema: Mi proyecto (C ++ -) consiste en varios subproyectos. En cada uno, tengo varios archivos con código que quiero ejecutar al inicio. Mi solución hasta ahora es usar variables estáticas que llaman al código respectivo en la inicialización de esta manera:

// Foo.cpp static TFooRegistry sFooRegistry; // does stuff in constructor.

Al construir mi proyecto usando dlls para cada subproyecto, todo funciona bien y el código funciona como se espera. Sin embargo, al vincular los subproyectos de forma estática, el vinculador determina que Foo.o no contiene ningún código al que se haga referencia desde el exterior y lo optimiza. Por supuesto, podría agregar una referencia a sFooRegistry en otro lugar, pero esto es tedioso y propenso a errores.

¿Qué formas (estándar de conformidad) de resolver esto hay?

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


Algún truco, pero revísalo. Para el sistema Win (pero no para Linux), use dllexport explícito; en este caso, el enlazador no sabe si este símbolo lo usó la aplicación externa o no.


No hay formas estándar de obligar a los objetos en las bibliotecas a inicializarse: debe usar trucos según su (s) plataforma (s) particular (es). La diferencia entre una DLL y una biblioteca estática (al menos en Windows) es que la primera tiene un código de inicio y apagado que ejecuta el sistema operativo, mientras que la última es solo una concatenación de archivos de objeto.

Además, el enlazador no está optimizando su código de inicio, simplemente no lo está enlazando, porque aparentemente nunca se usa. Los enlazadores son bestias bastante estúpidas: si quiere saber cómo hacen lo que hacen, eche un vistazo al libro Enlazadores y cargadores .