2011-09-22 22 views
5

Estaba trabajando con SFML, compilé un pequeño programa de prueba y agregué la opción de vinculación -lsfml-audio. Luego, utilicé ldd ./program para ver las bibliotecas dinámicas a las que estaba enlazando. Sorprendentemente, había muchas, ninguna de ellas se había seleccionado manualmente en mi archivo MAKE, ni usando pkg-config --libs.Vinculación de dependencias de una biblioteca compartida

Empecé a leer acerca de las bibliotecas compartidas, y tomé un pequeño ejemplo para resolver mis dudas. Sin embargo, tengo esta pregunta:

por qué algunas bibliotecas necesitan que usted agregue las dependencias en su makefile (ya sea manualmente o utilizando un script como pkg-config) y otras bibliotecas enlazar automáticamente sus dependencias?

Al crear su biblioteca dinámica, es tan fácil como añadir las opciones adecuadas -ldependency en el comando g++ -shared ... para evitar al usuario la molestia de añadir manualmente las dependencias más adelante. ¿Por qué muchas de las bibliotecas disponibles no hacen eso?

Supongo que debe estar relacionado con la capacidad de ajuste preciso que las bibliotecas se vinculan y tal.

Respuesta

6

Las bibliotecas compartidas generalmente enlazan en sus dependencias. Sin embargo, las bibliotecas estáticas no son capaces de hacerlo. pkg-config --libs a menudo incluye todas las dependencias (directas e indirectas) para que pueda cambiar a compilación estática simplemente agregando -static sin tener que agregar dependencias de biblioteca adicionales también.

Tenga en cuenta que estos excesos de dependencias directas se consideran no deseados en algunos casos (por ejemplo, debian intenta evitarlos en binarios empaquetados, ya que hacen que las transiciones del sondeo de la biblioteca sean más traumáticas de lo necesario). Puede indicar al vinculador que elimine las dependencias directas del ejecutable final que no son necesarias con el indicador -Wl,--as-needed.

+0

Creo que necesito hacer algunas llamadas aquí: las bibliotecas compartidas no suelen extraer sus dependencias (eso es 'libtool' cuando ve un archivo' * .la'). No es necesario que lo incluyan, ya que el cargador dinámico los resolverá desde el encabezado '.NEEDED' en las bibliotecas compartidas. Además de los problemas de overlinking que 'libtool' introduce, tener que buscar definiciones de símbolos en el tiempo del enlace también puede ralentizar una construcción mucho. –

+0

@honk, sí, libtool es una fuente de estos problemas. Sin embargo, los scripts pkg-config pueden hacerlo también. En cualquier caso, definitivamente no son necesarios en las plataformas ELF: solo necesita vincular lo que usa directamente (aunque esto incluye todo lo que se utiliza a través de funciones en línea o macros) – bdonlan

Cuestiones relacionadas