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.
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. –
@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