2011-12-22 17 views
11

He notado un error con las aplicaciones que dependen de las bibliotecas compartidas: si falta alguna dependencia, la aplicación fallará en el tiempo de carga incluso si el usuario no tiene la intención de utilizar la funcionalidad de la dependencia.Bibliotecas compartidas opcionales

Me gustaría que mis aplicaciones sean mejores que eso. Idealmente, en lugar de distribuir tantos como n paquetes diferentes, donde n = numberOfSupportedArchitectures * numberOfSupportedOS * Π (para cada biblioteca compartida) (el número de alternativas) Detectaría una excepción de "error al cargar bibliotecas compartidas" emitida en el momento de la carga cuando la biblioteca que quisiera, pero no es necesaria, se encuentra ausente, luego continúo la ejecución de una manera que simplemente evita el uso de los enlaces no resueltos. Pero obviamente no hay excepción que uno pueda atrapar. Si falta algo, todo se cae antes de que main() incluso comience.

Lo más cerca que puedo de tener control sobre el proceso de carga es resolver todos los enlaces con dlopen, dlsym y demás. Tan tedioso ¿Esperaría que ya hubiera una biblioteca disponible para hacer eso por mí?

Observo que esto no sería un problema en una distribución basada en fuente ni en Windows. Iba a poner paquetes binarios en las etiquetas, pero aparentemente no tengo el representante para acuñar etiquetas.

'parece que la solución más elegante estaría en refinar el comportamiento de los cargadores/enlazadores del sistema operativo.

Respuesta

0

Puede incluir las bibliotecas compartidas usted mismo y ajustar la ruta de búsqueda del enlazador a través del -rpath $ORIGIN.

+0

O ejecute el programa a través de un script que establece la variable de entorno 'LD_LIBRARY_PATH'. – rodrigo

+0

Las alternativas para cargar la biblioteca no son solo versiones diferentes de la cosa, tendrán interfaces completamente diferentes, o estarán ausentes del todo y la funcionalidad que proporcionarían simplemente no se manifestaría en el UX. Aunque esto puede proporcionar una vía para manejar bibliotecas ausentes; Podría crear bibliotecas de shill inertes con la misma interfaz que los objetivos faltantes, donde, si faltan los objetivos, podrían satisfacer la necesidad del vinculador de vincularse a algo. Parece tonto sin embargo. – mako

2

Puede echar un vistazo a weak symbols. Sin embargo, esto no forma parte del estándar C o C++, por lo tanto depende un poco del compilador. Pero si vas a GCC, creo que va a funcionar para ti.

+0

¿No es necesario que defina cuerpos inertes para cada símbolo en los encabezados de las bibliotecas? – mako

+1

No realmente. Puedes probar la existencia del símbolo. Si tiene 'void foo();' puede llamarlos de la siguiente manera: 'if (foo) foo();' – Krizz

+0

Ah. Pero tendré que declararlos todos como símbolos débiles? – mako

Cuestiones relacionadas