una librerias libreria dinamicas crear como c++ linux gcc static-linking static-initialization

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



librerias de linux (3)

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 se crean los objetos estáticos.

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

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


Una especie de hack me ayudó. Aún 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() {}


Utilizar:

g++ -u <SYMBOL_NAME> ...

Tenga en cuenta que -u es minúscula


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

Todas las bibliotecas estáticas mencionadas después de -Wl, - archive completo en la línea de comandos se incluyen completamente, también puede desactivar esta -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib si lo necesita, como por ejemplo en -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib