Erro do Linux ao carregar bibliotecas compartilhadas: não é possível abrir o arquivo de objeto compartilhado: Nenhum arquivo ou diretório


356

O programa faz parte do conjunto de testes Xenomai, compilado de forma cruzada do Linux PC para a cadeia de ferramentas Linux + Xenomai ARM.

# echo $LD_LIBRARY_PATH                                                                                                                                          
/lib                                                                                                                                                             
# ls /lib                                                                                                                                                        
ld-2.3.3.so         libdl-2.3.3.so      libpthread-0.10.so                                                                                                       
ld-linux.so.2       libdl.so.2          libpthread.so.0                                                                                                          
libc-2.3.3.so       libgcc_s.so         libpthread_rt.so                                                                                                         
libc.so.6           libgcc_s.so.1       libstdc++.so.6                                                                                                           
libcrypt-2.3.3.so   libm-2.3.3.so       libstdc++.so.6.0.9                                                                                                       
libcrypt.so.1       libm.so.6                                                                                                                                    
# ./clocktest                                                                                                                                                    
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory                                 

Edit: OK Eu não percebi que o .1 no final fazia parte do nome do arquivo. O que significa isso, afinal?


277
Isso pode acontecer se você instalou recentemente uma biblioteca compartilhada e não executou o ldconfig (8) posteriormente. Faça 'ldconfig', não há mal nisso.
AbiusX

25
+1 ao comentário do @AbiusX - executando o sudo ldconfig (assumindo que as bibliotecas estejam de fato onde deveriam estar [/ usr / bin / lib /, / usr / bin / include /, / usr / local / lib / e / usr / local / include / AFAIK], corrija-me se estiver errado) pode resolver esse problema. Felicidades!
AeroCross

Observe que esse erro também pode ocorrer se as permissões do seu arquivo lib forem alteradas de alguma forma. Alterar as permissões de volta para 644 resolveu isso para mim.
Geoffrey H

Respostas:


140

Atualização
Embora o que escrevo abaixo seja verdadeiro como resposta geral sobre bibliotecas compartilhadas, acho que a causa mais frequente desses tipos de mensagens é porque você instalou um pacote, mas não instalou a versão "-dev" desse pacote.


Bem, não está mentindo - não há libpthread_rt.so.1nessa lista. Você provavelmente precisará reconfigurá-lo e recriá-lo para que dependa da biblioteca que possui ou instale o que for fornecidolibpthread_rt.so.1 .

Geralmente, os números após o. So são números de versão, e muitas vezes você encontrará links simbólicos entre si, portanto, se você tiver a versão 1.1 do libfoo.so, terá um arquivo real libfoo.so.1.0, e links simbólicos foo.so e foo.so.1 apontando para o libfoo.so.1.0. E se você instalar a versão 1.1 sem remover a outra, terá o libfoo.so.1.1 e libfoo.so.1 e libfoo.so agora apontarão para o novo, mas qualquer código que exija essa versão exata pode use o arquivo libfoo.so.1.0. Código que depende apenas da API da versão 1, mas não se importa se é 1.0 ou 1.1, especificará libfoo.so.1. Como o orip apontou nos comentários, isso é explicado bem em http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html .

No seu caso, você pode se safar da ligação simbólica libpthread_rt.so.1para libpthread_rt.so. No entanto, não há garantias de que ele não decifre seu código e coma seus jantares de TV.


5
... oh Deus, o .1 faz parte do nome do arquivo. Alguma idéia do que isso significa?
zaratustra 26/01/09

O orip merece um +1 para esse link. Se você não se importa, @orip, gostaria de colocar seu link na resposta?
Paul Tomblin

@PaulTomblin, estou recebendo um erro semelhante ao reparar o grub. Você pode me ajudar sobre isso? Esta questão -> askubuntu.com/questions/123275/cant-repair-grub/...
Eray

@ TomNysetvold e Paul, sim - é o mesmo documento.
oriP

Encontrei muitas informações ruins e soluções indiretas na minha busca por essa resposta. Algo dentro de mim me disse para continuar pesquisando até encontrar uma solução de comando único.
c ..

327

Sua biblioteca é uma biblioteca dinâmica. Você precisa informar ao sistema operacional onde ele pode ser localizado no tempo de execução.

Para fazer isso, precisaremos executar essas etapas fáceis:

(1) Encontre onde a biblioteca está localizada, se você não souber.

sudo find / -name the_name_of_the_file.so

(2) Verifique a existência da variável de ambiente do caminho da biblioteca dinâmica ( LD_LIBRARY_PATH)

$ echo $LD_LIBRARY_PATH

se não houver nada a ser exibido, adicione um valor de caminho padrão (ou não, se desejar)

$ LD_LIBRARY_PATH=/usr/local/lib

(3) Adicionamos o caminho do desejo, exportamos e experimentamos o aplicativo.

Observe que o caminho deve ser o diretório em que path.so.somethingestá. Então, se path.so.somethingestá em/my_library/path.so.something , deve ser:

$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app

source: http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html


3
A resposta acima mencionada foi muito clara. Obrigado em primeiro lugar. Eu tentei fazer isso no meu caminho do projeto Eclipse CDT (Lubuntu). / Debug $ echo $ LD_LIBRARY_PATH /home/akhil/HDE/x86.linux/lib:/home/akhil/HDE/x86.linux/lib .. "/home/akhil/HDE/x86.linux/lib" é aqui que minhas bibliotecas estão realmente disponíveis mesmo, mas ainda assim recebo o mesmo erro. Alguma sugestão!
Nahasapeemapetilon

12
Tente um comando "ldconfig" depois de exportar sua biblioteca. Pode ser necessário executar este comando como "sudo".
XOR

5
Todos os comandos na etapa (1) podem ser realizados findsozinhos:find / -name the_name_of_the_file.so
wbadart 13/17/17

3
Eu acredito que LD_LIBRARY_PATHdeve apontar para o diretório que contém path.so.something, não para path.so.somethingsi mesmo.
gerrit

2
Seguir seus comandos passo a passo resolveu meu problema! Muito obrigado!
Fisher Coder

156

Aqui estão algumas soluções que você pode tentar:

ldconfig

Como o AbiusX apontou: Se você acabou de instalar a biblioteca, basta executar o ldconfig .

sudo ldconfig

O ldconfig cria os links e o cache necessários para as bibliotecas compartilhadas mais recentes encontradas nos diretórios especificados na linha de comandos, no arquivo /etc/ld.so.conf e nos diretórios confiáveis ​​(/ lib e / usr / lib).

Normalmente, seu gerenciador de pacotes cuidará disso quando você instalar uma nova biblioteca, mas nem sempre, e não será prejudicial executar o ldconfig, mesmo que esse não seja o seu problema.

Pacote de desenvolvimento ou versão incorreta

Se isso não funcionar, eu também verificaria a sugestão de Paul e procuraria uma versão "-dev" da biblioteca. Muitas bibliotecas são divididas em pacotes dev e non-dev. Você pode usar este comando para procurá-lo:

apt-cache search <libraryname>

Isso também pode ajudar se você simplesmente tiver a versão errada da biblioteca instalada. Algumas bibliotecas são publicadas em versões diferentes simultaneamente, por exemplo, Python.

Localização da biblioteca

Se você tem certeza de que o pacote certo está instalado e o ldconfig não o encontrou, ele pode estar apenas em um diretório fora do padrão. Por padrão, ldconfig examina /lib, /usr/libe diretórios listados no /etc/ld.so.confe $LD_LIBRARY_PATH. Se a sua biblioteca estiver em outro lugar, você poderá adicionar o diretório em sua própria linha /etc/ld.so.conf, anexar o caminho da biblioteca $LD_LIBRARY_PATHou mover a biblioteca para /usr/lib. Então corraldconfig .

Para descobrir onde está a biblioteca, tente o seguinte:

sudo find / -iname *libraryname*.so*

(Substituir libraryname pelo nome da sua biblioteca)

Se você seguir o $LD_LIBRARY_PATHcaminho, coloque-o em seu ~/.bashrcarquivo para que ele seja executado sempre que você fizer login:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library

3
Por padrão, / lib e / usr / lib, mas não / usr / local / lib? Isso me impressionou várias vezes ao longo da minha carreira e desperdiçou horas.
darenw

@ DarenW Para mim trabalha com / usr / local / lib. Ubuntu 14.04 LTS.
gon1332

Adicionar .confmeus próprios arquivos com os caminhos da lib não padrão que eu preciso /etc/ld.so.conf.d(apontado por /etc/ld.so.conf) fez o truque.
precisa saber é o seguinte

4
+1 por precisar executar o ldconfig. Eu não estava usando um gerenciador de pacotes. Eu tive que compilar a partir da fonte, então isso foi necessário.
9116 Jeff

7
esta é a verdadeira resposta
Scott Stensland

53

Eu tive um erro semelhante, eu poderia resolvê-lo dando,

sudo ldconfig -v

Espero que isto ajude.


37
Olá, isso pode muito bem resolver o problema ... mas seria bom se você pudesse editar sua resposta e fornecer uma pequena explicação sobre como e por que funciona :) Não se esqueça - existem muitos novatos no Stack overflow, e eles podem aprender uma coisa ou duas com sua experiência - o que é óbvio para você pode não ser o mesmo para eles.
Taryn East

Ele não será capaz de explicar. Ele apenas copiou sua resposta.
Jhourlad Estrella 17/07/19

resposta duplicado ... veja mesma resposta acima criado um dia antes
Scott Stensland

25

Você precisa garantir que você especifique o caminho da biblioteca durante a vinculação ao compilar seu arquivo .c:

gcc -I / usr / local / include xxx.c -o xxx -L / usr / local / lib -Wl, -R / usr / local / lib

A parte -Wl, -R diz ao binário resultante que também procure a biblioteca em / usr / local / lib no tempo de execução antes de tentar usá-la em / usr / lib /

Espero que ajude você.


3
Esta é a opção que eu estava procurando. Talvez seja melhor -Wl,-rpath DIR.
Jrw32982 suporta Monica

11
ótimo! Eu enfrentei esse problema quando meu programa foi compilado com sucesso com o cmake, mas não foi possível iniciar devido a erro. Essa resposta resolveu o meu problema #
377 Ivan Talalaev

15

Tente adicionar LD_LIBRARY_PATH, o que indica caminhos de pesquisa, ao seu ~/.bashrcarquivo

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

Funciona!


13

A página de referência do linux.org explica a mecânica, mas não explica nenhuma das motivações por trás disso :-(

Para isso, consulte o Sun Linker e o Guia de bibliotecas

Além disso, observe que a "versão externa" é amplamente obsoleta no Linux, porque a versão de símbolo (uma extensão GNU) permite que você tenha várias versões incompatíveis da mesma função para estar presente em uma única biblioteca. Esta extensão permitiu à glibc ter a mesma versão externa: libc.so.6nos últimos 10 anos.


7
cd /home/<user_name>/
sudo vi .bash_profile

adicione essas linhas no final

LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH

5

Eu tive um erro semelhante e não foi corrigido ao fornecer LD_LIBRARY_PATH em ~ / .bashrc. O que resolveu meu problema foi adicionando o arquivo .conf e carregando-o. Vá para o terminal e esteja em su.

gedit /etc/ld.so.conf.d/myapp.conf

Adicione o caminho da sua biblioteca neste arquivo e salve (por exemplo: / usr / local / lib). Você deve executar o seguinte comando para ativar o caminho:

ldconfig

Verifique seu novo caminho de biblioteca:

ldconfig -v | less

Se isso mostrar os arquivos da sua biblioteca, você estará pronto.


4

Outra solução possível, dependendo da sua situação.

Se você sabe que libpthread_rt.so.1 é o mesmo que libpthread_rt.so, é possível criar um link simbólico:

ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1

Agora ls -l /libdeve mostrar o link simbólico e o que ele aponta.


4

Eu tive esse erro ao executar meu aplicativo com o Eclipse CDT no Linux x86.
Para corrigir isso:

  1. No Eclipse:

    Executar como -> Executar configurações -> Ambiente

  2. Defina o caminho

    LD_LIBRARY_PATH=/my_lib_directory_path
    

2

Tudo o que eu precisava fazer era correr:

sudo apt-get install libfontconfig1

Eu estava na pasta localizada em /usr/lib/x86_64-linux-gnue funcionou perfeitamente.


2

Se você estiver executando seu aplicativo no Microsoft Windows, o caminho para as bibliotecas dinâmicas (.dll) precisará ser definido na variável de ambiente PATH.

Se você estiver executando seu aplicativo no UNIX, o caminho para suas bibliotecas dinâmicas (.so) precisará ser definido na variável de ambiente LD_LIBRARY_PATH.


1

tente instalar o sudo lib32z1

sudo apt-get install lib32z1


1

O erro ocorre porque o sistema não pode se referir ao arquivo de biblioteca mencionado. Siga os seguintes passos:

  1. A execução locate libpthread_rt.so.1listará o caminho de todos os arquivos com esse nome. Vamos supor que seja um caminho /home/user/loc.
  2. Copie o caminho e execute cd home/USERNAME. Substitua USERNAME pelo nome do usuário ativo atual com o qual você deseja executar o arquivo.
  3. Execute vi .bash_profilee no final do LD_LIBRARY_PATHparâmetro, pouco antes ., adicione a linha /lib://home/usr/loc:.. Salve o arquivo.
  4. Feche o terminal e reinicie o aplicativo. Deveria correr.

0

Eu recebi esse erro e acho que é o mesmo motivo que você

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

Tente isso. Corrija as permissões nos arquivos:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 
chown -R root:root *

"Sudo su" para obter permissões no seu sistema de arquivos.


0

Eu recebi esse erro e acho que é o mesmo motivo que você

erro ao carregar bibliotecas compartilhadas: libnw.so: não é possível abrir o arquivo de objeto compartilhado: Nenhum arquivo ou diretório

Tente isso. Corrija as permissões nos arquivos:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 


0

Eu uso o Ubuntu 18.04

A instalação do pacote "-dev" correspondente funcionou para mim,

sudo apt install libgconf2-dev

Eu estava recebendo o erro abaixo até instalar o pacote acima,

turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.