Cuando ejecuto un proceso que se vincula a una biblioteca compartida en tiempo de ejecución (vinculado cuando se inicia el proceso, no vinculado posteriormente dlload()), ¿dónde busca ese .soarchivo de biblioteca compartida ( ) diferente LD_LIBRARY_PATH?
Fondo:
Tengo un código C ++ que escribí que usa una biblioteca de terceros en particular. He instalado la biblioteca y he compilado mi código en dos plataformas diferentes, ambas Ubuntu pero diferentes versiones, y también diferentes versiones de gcc. La biblioteca se compiló e instaló desde el origen, y se encuentra en /usr/local/libambas plataformas. Cuando compilo mi código, enlazo con los pkg-config --libsparámetros de la biblioteca de terceros y he verificado que pkg-config --libsdevuelve exactamente lo mismo en ambas plataformas.
Mi código se compila correctamente en ambas plataformas y LD_LIBRARY_PATHno está definido (o definido como vacío:) ""en ambas plataformas. Sin embargo, cuando lo ejecuto en una plataforma funciona bien, y en la otra me sale este error:
error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory
Curiosamente, la que no funciona es la versión más nueva de Ubuntu y gcc. : /
Así que estoy tratando de descubrir cómo el que trabaja puede localizar la biblioteca, de modo que pueda hacer que el roto localice la biblioteca de la misma manera. (es decir, sin configuración LD_LIBRARY_PATH)
Actualizar:
Aquí está mi salida de cat /etc/ld.so.conf.d/*
... en el sistema de trabajo (más antiguo):
/usr/lib/mesa
/usr/lib32/mesa
/usr/lib/alsa-lib
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
... en el sistema roto (más nuevo):
# libc default configuration
/usr/local/lib
# Multiarch support
/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/mesa
fuente

/etc/ld.so.conf.d/*.conf, pero no estoy seguro de eso./usr/local/lib/libthrift-0.9.0.sopero aún así da el errorerror while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory... ¿Hay alguna razón por la que no recogería un directorio/etc/ld.so.conf.d/*.conf?sudo ldconfig -vcomo se sugiere a continuación. Si todavía no funciona, actualice su pregunta con la salida deldd /path/to/your/application.Respuestas:
Todo este camino está relacionado con algo llamado multi-arco. Básicamente es para permitirle tener bibliotecas de 32 bits y 64 bits en el mismo sistema.
Después de copiar el archivo, ¿ejecutó ldconfig?
fuente
sudo ldconfigy eso solucionó el problema! (No necesitaba volver a compilar mi código ni nada ...) Solo quiero entender, sin embargo ... Usted dijo "Después de copiar el archivo", pero no copié un archivo. ¿Quiere decir después de que construí e instalé la biblioteca, o después de compilar mi programa?sudo ldconfigfuncionó. ¿Es esto algo que las bibliotecas a menudo se ejecutan automáticamente para usted como parte de su instalación, y esta por alguna razón no lo hizo? Solo me preguntaba por qué no "normalmente" tengo que hacer esto, pero solo lo hice en este caso ...¡La información contenida en la pregunta anterior Y la primera (y solo ATT) respuesta , me ayudó a resolver * un * problema mío similar en WSL Ubuntu (en Win10 64)!
En mi caso, el ejecutable no pudo encontrar una biblioteca. Me di cuenta de que en última instancia, la biblioteca recién hecho quedó posicionada en
/usr/lib64, pero las líneas de múltiples arquitecturas de/etc/ld.so.conf.d/x86_64-linux-gnu.conflo que no incluyo ese directorio.Entonces corrí
sudo ldconfig /usr/lib64y eso finalmente lo arregló. (ejecutarlo solo sin el parámetro de directorio no lo hizo 'mágicamente' para encontrar las bibliotecas, por cierto). No está claro si 'reiniciar' mi WSL bash ayudó ... Creo que ni siquiera era necesario.
fuente
/etc/ld.so.conf.d/usr-local.confy luego lo ejecutésudo ldconfigsin efecto: el cargador no encontró las bibliotecas en ese directorio. Después de correr,sudo ldconfig /usr/local/libtodo funcionó bien.