libfoo.so.major.minor.
Cuando se enlaza un programa, el enlazador ld
embebe esa información en el binario que se genera.
Esto se puede ver con ldd.
Más tarde, cuando se ejecuta este programa, el
enlazador dinámico ld.so utiliza esa
información para encontrar la biblioteca
dinámica pertinente:
Las reglas para las bibliotecas compartidas son bastante simples.
Algunas veces sucede que una biblioteca está escrita en varios ficheros, y las funciones internas son visibles para permitir la comunicación entre esos ficheros. Esos nombre de funciones suelen empezar con un guión bajo, y no son parte del API.
Nótese que el esquema de nombres de las bibliotecas es ubicuo en las plataformas de OpenBSD, tanto si el formato es ELF como a.out.
gcc -shared -fpic|-fPIC -o libfoo.so.4.5 obj1 obj2
Si intenta cambiar el nombre de la biblioteca más tarde para ajustar el número de versión, no funcionará: las bibliotecas ELF usan magia adicional para el nombre interno de la biblioteca, por lo que debe enlazar desde la primera vez con la versión correcta.
Por otra parte, recuerde que puede anular y cambiar variables
de Makefile desde la línea de órdenes,
usando MAKE_FLAGS en el fichero
Makefile del porte. Esto le será de gran
utilidad en algunos portes, como por ejemplo los basados en
libtool, ya que proveen de una de estas variables de
versión por cada biblioteca que crean.
El mejor modo de manejar los portes basados en libtool
es configurar la variable USE_LIBTOOL=Yes.
Esto activa la versión de libtool presente en el árbol de
portes, y se encarga automáticamente de la mayoría de los detalles:
SHARED_LIBS y reemplaza
automáticamente los números de versión.
${WRKBUILD}/shared_libs.log
que puede ser incluido directamente en el Makefile del porte.
ld usa señalizadores -L
para configurar rutas en las que busca
bibliotecas. En cuanto encuentra una biblioteca que
coincide con sus requisitos, para de buscar.
ld.so usa la información guardada
mediante ldconfig para encontrar la
biblioteca requerida.
qt.1.45 y qt.2.31. Como los dos
portes no se pueden instalar de forma simultánea, para
asegurarnos de que un programa cualquiera enlace con qt.1, esa
biblioteca se proveerá como
/usr/local/lib/qt/libqt.so.1.45, y los programas
se enlazarán usando
ld -o program program.o -L/usr/local/lib/qt -lqt.
De igual modo, un programa que enlace con qt.2 usará el
fichero /usr/local/lib/qt2/libqt.so.2.31 con
ld -o program program.o -L/usr/local/lib/qt2 -lqt.
Para resolver esas bibliotecas en el momento de la
ejecución, se proveerá un enlace llamado
/usr/local/lib/libqt.so.1.45 y otro llamado
/usr/local/lib/libqt.so.2.31. Esto será
suficiente para satisfacer a ld.so.
Enlazar un programa usando qt1 con
ld -o program program.o -L/usr/local/lib -lqt es
un error. Este código asume que qt.2.31
no ha sido instalado, lo que es una presunción
errónea.
Estos trucos sólo son necesarios en casos especiales en los que se den bibliotecas para las que se necesite proveer de un periodo de transición entre versiones. Por lo general, bastará con asegurarse de que la biblioteca aparezca en /usr/local/lib.
make lib-depends-check o
make port-lib-depends-check
para verificar que un porte mencione
todas las bibliotecas que requiere.
Simplemente debe escribirlas en LIB_DEPENDS/WANTLIB de esta forma:
LIB_DEPENDS += ::x11/gtk+
WANTLIB += gtk.>=1.2,gdk.>=1.2
Además, especificar las bibliotecas estáticas en
una línea de WANTLIB no es un error. WANTLIB
es evaluado por completo en el momento de la
compilación de un paquete: el paquete resultante
tendrá la información sobre dependencias de
bibliotecas embebido, en forma de líneas para
ld.so, que contienen el número
superior.inferior que fue usado para su compilación, y
nada para las bibliotecas compartidas.
También debe proveer de RUN_DEPENDS si un porte requiere algo más que compilar enlazando a una biblioteca. Esto permitirá al porte compilar correctamente en arquitecturas que no tengan soporte para bibliotecas compartidas.
De hecho, proveer líneas LIB_DEPENDS incluso para bibliotecas estáticas es una buena idea: esto simplificará la acutalización del porte si una cierta dependencia pasa de biblioteca estática a biblioteca compartida.
La líneas WANTLIB deben especificar las mismas
rutas que se utilizan para ld. Con el ejemplo
anterior, un fragmento de dependencia típico de qt2 dice:
WANTLIB += lib/qt2/qt.=2.
Esto permite a la dependencia comprobar el
código para poder hacer lo correcto si se encuentra con
varias versiones de la misma biblioteca.