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