2011-01-22 14 views
22

Estoy usando una biblioteca de C++ que se puede generar como 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.Cómo forzar a gcc a vincular objetos C++ estáticos sin referencia de una biblioteca

Esto funciona bien siempre que se use la biblioteca compartida. Cuando se utiliza 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 alguna manera de forzar a gcc para que incluya todos los objetos estáticos de una biblioteca al enlazar?

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

Respuesta

22

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

Todas las bibliotecas estáticas mencionadas después de -Wl, - todo-archivo en la línea de comandos se incluye completamente, puede desactivarlo también si es necesario, como en p. -Wl,--whole-archive -lyourlib -Wl,--no-whole-archive -lotherlib

+5

-Wl, - archivo completo hace que se incluyan muchos símbolos que ya están incluidos en otras bibliotecas o que no se pueden resolver. ¿Hay una manera más fina de incluir la estática? –

+0

Esto no tiene sentido Gene: es lo mismo que cargar una biblioteca compartida: obtienes toda la biblioteca, y nada más. Es cierto que tengo una noción equivocada de encontrar referencias externas, por lo que debe tener el orden correcto. – Yttrill

+7

Desactivar el comportamiento con '-Wl, - no-whole-archive' no es opcional, incluso si no tiene más bibliotecas para incluir. GCC agregará todas las bibliotecas de sistema estándar al final de su comando, por lo que si deja '' -whole-archive' activado, todas se verán afectadas y se generará un problema de símbolo duplicado. @GeneVincent comentó acerca de –

1

Un tipo de truco me ayudó. Todavía tiene 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() {} 
+0

Pero eso supone que tiene la colaboración del autor '.cpp', que ahora necesita estar al tanto de cada objeto de registro-ayuda en la biblioteca estática. – einpoklum

Cuestiones relacionadas