Cómo forzar a gcc a vincular objetos estáticos de C++ no referenciados desde una biblioteca


Estoy usando una biblioteca de C++ que se puede construir como una biblioteca compartida o estática. Esta biblioteca utiliza una técnica de fábrica, donde los objetos estáticos se registran cuando se inicia el programa y los objetos estáticos se crean.

Esto funciona bien siempre y cuando se utilice la biblioteca compartida. Cuando se utiliza la versión estática, ninguno de los objetos estáticos se incluyen en el programa final (porque no se hace referencia a ellos directamente) y por lo tanto su funcionalidad no está disponible.

Es ¿hay una manera de forzar a gcc a incluir todos los objetos estáticos de una biblioteca al enlazar?

La biblioteca es de Código Abierto y podría modificarla, si eso ayuda.

Author: Jonathan Leffler, 2011-01-22

3 answers

Puede usar -Wl,--whole-archive -lyourlib, vea la página de manual de ld para más información.

Cualquier biblioteca estática mencionada después de-Wl, whole whole-archive en la línea de comandos se incluye completamente, también puede desactivar esto de nuevo si lo necesita, como por ejemplo, -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib

 23
Author: nos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-22 13:05:26

Una especie de truco me ayudó. Todavía hay que incluir el encabezado aunque.

// in the header with your class
struct RegistrationHelper {
    RegistrationHelper();
};

static RegistrationHelper Helper;

// in your cpp where you register your class
RegistrationHelper::RegistrationHelper() {}
 1
Author: rka444,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-09 19:48:41

Uso:

g++ -u <SYMBOL_NAME> ...

Tenga en cuenta que -u es

 0
Author: PA314159,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-27 23:14:57