Tengo un ejecutable que necesita vincularse libtest.so
dinámicamente, así que los puse en el mismo directorio, luego:
cd path_to_dir
./binary
Pero tengo esto:
error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
¿Cómo puede ser incapaz de encontrar libtest.so
cuál ya está en el mismo directorio que el ejecutable?
linux
autoloader
linuxer
fuente
fuente
echo $LD_LIBRARY_PATH
está vacío en mi máquina :(:
), no un punto y coma.Si bien puede configurar LD_LIBRARY_PATH para que el enlazador dinámico sepa dónde buscar, hay mejores opciones. Puede colocar su biblioteca compartida en uno de los lugares estándar, consulte
/etc/ld.so.conf
(en Linux) y/usr/bin/crle
(en Solaris) la lista de estos lugaresPuede pasar
-R <path>
al vinculador al crear su binario, que se agregará<path>
a la lista de directorios escaneados para su biblioteca compartida. Aquí hay un ejemplo. Primero, mostrando el problema:libtest.h:
libtest.c:
Hola C:
Makefile (se deben usar pestañas):
Vamos a ejecutarlo:
¿Como arreglarlo? Agregar
-R <path>
a las banderas de enlace (aquí, mediante la configuraciónLDFLAGS
).Mirando el binario, puede ver que necesita
libtest.so.0
:El binario buscará sus bibliotecas, además de los lugares estándar, en el directorio especificado:
Si desea que el binario se vea en el directorio actual, puede configurar RPATH en
$ORIGIN
. Esto es un poco complicado, porque debes asegurarte de que el signo de dólar no sea interpretado por make. Aquí hay una forma de hacerlo:fuente
make
, como cuando se llama manualmenteg++
, intente-Wl,-rpath='$ORIGIN'
(tenga en cuenta las comillas simples) para evitar que se$ORIGIN
expanda a una cadena vacía.Para cargar los objetos compartidos desde el mismo directorio que su ejecutable, simplemente ejecute:
Nota: No modificará la variable LD_LIBRARY_PATH de su sistema. El cambio solo afecta a esto, y solo a esto, a la ejecución de su programa.
fuente
Para cualquiera que todavía tenga dificultades sin una respuesta, encontré una con la siguiente sugerencia:
Puede intentar actualizar ld.so.cache usando:
sudo ldconfig -v
Trabajó para mi.
fuente
Para cualquiera que use CMake para su compilación, puede establecer
CMAKE_EXE_LINKER_FLAGS
lo siguiente:Esto propagará correctamente los indicadores del vinculador para todos los tipos de compilación (por ejemplo, Debug, Release, etc.) para buscar primero los archivos .so en el directorio de trabajo actual.
fuente
El vinculador dinámico decidirá dónde buscar bibliotecas. En caso de Linux, el enlazador dinámico generalmente es
GNU ld.so
(o una alternativa que por lo general se comportará idénticas por razones de compatibilidad.Para citas de Wikipedia:
Fuente: https://en.wikipedia.org/wiki/Rpath
fuente