Como você especifica o local das bibliotecas para um binário? (linux)

25

Para esta pergunta eu vou estar usando um exemplo específico, mas realmente isso generaliza para praticamente qualquer binário no Linux que não consegue encontrar suas bibliotecas dependentes. Então, eu tenho um programa que não é executado por falta de bibliotecas:

./cart5: error while loading shared libraries: libcorona-1.0.2.so: cannot open shared object file: No such file or directory

ldd lança alguma luz sobre o assunto:

linux-vdso.so.1 =>  (0x00007fff18b01000)
libcorona-1.0.2.so => not found
libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/libstdc++.so.6 (0x00007f0975830000)
libm.so.6 => /lib/libm.so.6 (0x00007f09755af000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f0975399000)
libc.so.6 => /lib/libc.so.6 (0x00007f0975040000)
libz.so.1 => /lib/libz.so.1 (0x00007f0974e2b000)
/lib64/ld-linux-x86-64.so.2 (0x00007f0975b36000)

No entanto, a corona está instalada:

oliver@human$ find / -name libcorona-1.0.2.so 2> /dev/null

/usr/local/lib64/libcorona-1.0.2.so
/home/oliver/installed/corona-1.0.2/src/.libs/libcorona-1.0.2.so

Como eu digo ao binário onde procurar a biblioteca "ausente"?

    
por Mala 25.09.2010 / 09:40

3 respostas

34

Por uma vez, defina a variável LD_LIBRARY_PATH para uma lista de diretórios separada por dois pontos para pesquisar. Isso é análogo a PATH para executáveis, exceto que os diretórios padrão do sistema são pesquisados adicionalmente após os especificados pelo ambiente.

LD_LIBRARY_PATH=/usr/local/lib64 ./cart5

Se você tem um programa que mantém as bibliotecas em um local fora do padrão e não consegue encontrá-las sozinho, é possível escrever um script de wrapper:

#!/bin/sh
if [ -n "$LD_LIBRARY_PATH" ]; then
  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64
else
  LD_LIBRARY_PATH=/usr/local/lib64
fi
export LD_LIBRARY_PATH
exec /path/to/cart5 "$@"

A lista de diretórios padrão do sistema é mantida em /etc/ld.so.conf . Sistemas recentes permitem que este arquivo inclua outros arquivos; Se o seu contiver algo como include /etc/ld.so.conf.d/*.conf , crie um novo arquivo chamado /etc/ld.so.conf.d/mala.conf contendo os diretórios que você deseja adicionar. Depois de alterar /etc/ld.so.conf ou um arquivo incluído, execute /sbin/ldconfig para que suas alterações entrem em vigor (isso atualiza um cache).

( LD_LIBRARY_PATH também se aplica a muitos outros unices, incluindo FreeBSD, NetBSD, OpenBSD, Solaris e Tru64. HP-UX tem SHLIB_PATH e Mac OS X tem DYLD_LIBRARY_PATH . /etc/ld.so.conf tem análogos na maioria dos unices mas a localização e sintaxe difere mais amplamente.)

    
por 25.09.2010 / 13:24
13

Se você quiser evitar o LD_LIBRARY_PATH, também poderá fazer isso durante a vinculação:

gcc -o exename -L/path/to/dynamiclib/ -lnameofLib \
    -Wl,-R/path/to/dynamiclib/ sourceCode1.c ...

O -Wl, ... é usado para passar comandos extras para o vinculador e, nesse caso, com -R, você diz ao vinculador para armazenar esse caminho como o "caminho de pesquisa padrão" para o .so

Eu mantenho anotações de muitas dicas pequenas como esta, no meu site:

link

    
por 25.09.2010 / 18:10
0

Isso indica que a libcorona não está instalada no caminho correto. Mova o diretório libcorona para o caminho correto, o problema será resolvido ..

    
por 05.03.2018 / 10:20