Onde o Ubuntu procura por bibliotecas compartilhadas?

18

Quando executo um processo vinculado a uma biblioteca compartilhada no tempo de execução (vinculado quando o processo é iniciado, não vinculado posteriormente com dlload() ), onde ele procura esse arquivo de biblioteca compartilhada ( .so ) diferente de LD_LIBRARY_PATH ?

Histórico:

Eu tenho algum código C ++ que eu escrevi que usa uma biblioteca particular de terceiros. Eu instalei a biblioteca e compilei meu código em duas plataformas diferentes, tanto o Ubuntu, mas versões diferentes, e versões diferentes do gcc também. A biblioteca foi compilada e instalada a partir do código-fonte e está localizada em /usr/local/lib em ambas as plataformas. Quando eu compilo meu código, eu faço um link com os parâmetros pkg-config --libs para a biblioteca de terceiros e verifiquei que pkg-config --libs retorna exatamente a mesma coisa em ambas as plataformas.

Meu código é compilado com êxito nas duas plataformas e LD_LIBRARY_PATH não está definido (ou definido como vazio: "" ) em ambas as plataformas. No entanto, quando eu corro em uma platoform funciona bem, e por outro eu recebo este erro:

error while loading shared libraries: libthrift-0.9.0.so: cannot open shared object file: No such file or directory

Curiosamente, os que não funcionam são a versão mais recente do Ubuntu e do gcc. : /

Então, eu estou tentando descobrir como o trabalho é capaz de localizar a biblioteca, para que eu possa fazer o quebrado localizar a biblioteca da mesma maneira. (isto é, sem definir LD_LIBRARY_PATH )

Atualização:

Aqui está minha saída de cat /etc/ld.so.conf.d/*

... no sistema de trabalho (mais antigo):

/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

... no sistema quebrado (mais recente):

# 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
    
por Dave Lillethun 25.09.2013 / 23:10

1 resposta

20

Esse negócio de caminho inteiro está relacionado a algo chamado multi-arch. Basicamente, é permitir que você tenha bibliotecas de 32 e 64 bits no mesmo sistema.

Depois de copiar o arquivo, você executou o ldconfig?

ldconfig  creates,  updates,  and removes the necessary links and cache
       (for use by the run-time linker,  ld.so)  to  the  most  recent  shared
       libraries  found  in  the directories specified on the command line, in
       the file /etc/ld.so.conf, and in the trusted directories (/usr/lib  and
       /lib).   ldconfig  checks the header and file names of the libraries it
       encounters when determining which  versions  should  have  their  links
       updated.  ldconfig ignores symbolic links when scanning for libraries.
    
por Matt H 25.09.2013 / 23:42