Lo instalé ATLAS
(con Netlib LAPACK
) en una imagen de Docker y ahora, cada vez que lo ejecuto ldconfig
, aparece los siguientes errores:
ldconfig: Can't link /usr/local/lib//usr/local/lib/libtatlas.so to libtatlas.so
ldconfig: Can't link /usr/local/lib//usr/local/lib/libsatlas.so to libsatlas.so
Por supuesto, /usr/local/lib//usr/local/lib/libtatlas.so
no existe, pero estoy confundido por qué intentaría buscar este archivo, ya que libtatlas.so
no es un enlace simbólico:
root@cd00953552ab:/usr/local/lib# ls -la | grep atlas
-rw-r--r-- 1 root staff 15242054 Apr 27 08:18 libatlas.a
-rwxr-xr-x 1 root staff 17590040 Apr 27 08:18 libatlas.so
-rwxr-xr-x 1 root staff 17492184 Apr 27 08:18 libsatlas.so
-rwxr-xr-x 1 root staff 17590040 Apr 27 08:18 libtatlas.so
¿Por qué sucedería esto? ¿Existe alguna manera de solucionarlo o desactivar este mensaje de error?
Editar: aquí está el resultado de Readelf:
root@cd00953552ab:/usr/local/lib# eu-readelf -a /usr/local/lib/libatlas.so | grep SONAME
SONAME Library soname: [/usr/local/lib/libtatlas.so]
Respuesta1
Por alguna razón, probablemente relacionada con la forma en que se construyeron las bibliotecas (y más específicamente, se vincularon), almacenaron su directorio de instalación en su soname: por lo tanto, libtatlas.so
el soname es /usr/local/lib/libtatlas.so
. ldconfig
intenta vincular bibliotecas a su soname, si no existe, en el mismo directorio: encuentra /usr/local/lib/libtatlas.so
, verifica su soname, determina que es necesario realizar un vínculo desde /usr/local/lib//usr/local/lib/libtatlas.so
(el directorio y el soname concatenados) hacia /usr/local/lib/libtatlas.so
y falla porque /usr/local/lib/usr/local/lib
no No existe.
La forma adecuada de solucionar este problema es asegurarse de que los sonames de las bibliotecas estén definidos correctamente. Normalmente esperaría libtatlas.so.3
etc. sin nombre de directorio (la versión dependería del nivel ABI de la biblioteca que se está creando). Probablemente necesite reconstruir las bibliotecas o encontrar un paquete compilado correctamente...
Alternativamente, puede editar el nombre de una biblioteca usandoParcheELF:
patchelf --set-soname libtatlas.so /usr/local/lib/libtatlas.so
Lo ideal sería volver a vincular los programas que creó usando esta biblioteca, ya que también tendrán el nombre integrado (también puede parchearlo usando PatchELF).
En un sistema en evolución, realmente querrás especificar una versión en el nombre, pero en un contenedor probablemente no importe; de todos modos deberías reconstruir el contenedor para las actualizaciones.
Respuesta2
En este caso particular de la biblioteca BLAS ATLAS
. La solución a la causa real es corregir el archivo MAKE utilizado para crear el paquete.
Vea la respuesta de @Stephen Kitt para conocer el razonamiento.
Sin embargo, debido a unaerror de --set-sonameen patchelf
, la solución patchelf no puede funcionar.
La ruta de su biblioteca contiene '/usr/local', por lo que supongo que se está compilando a partir del código fuente.
Verifique el archivo $(SRC)/makes/Make.lib
, donde $(SRC)
está el directorio raíz de su código fuente.
En particular estas líneas:
LDTRY:
$(LD) $(LDFLAGS) -shared -soname $(LIBINSTdir)/$(outso) -o $(outso) \
-rpath-link $(LIBINSTdir) \
--whole-archive $(libas) --no-whole-archive $(LIBS)
El soname es inadecuado aquí: -soname $(LIBINSTdir)/$(outso)
. Cámbielo a -soname $(outso)
y luego reconstruir la biblioteca solucionará este problema.
En caso de que ya tenga una compilación exitosa, cambie la línea correspondiente en $(BUILD)/lib/Makefile
, donde $(BUILD)
está el directorio para construir la biblioteca. Luego make shared
construir las bibliotecas.
Utilice un comando como readelf -d libtatlas.so | grep soname
para comprobar el nombre de usuario en el archivo .so resultante. No debe contener ninguna parte del directorio.
Si no puede encontrar el archivo MAKE correcto (por ejemplo, usando una versión diferente de ATLAS
), intente grep -IR soname
localizar el lugar que necesita modificar.