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?
linux
shared-libraries
file-not-found
xenomai
zaratustra
fonte
fonte
Respostas:
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.1
nessa 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.1
paralibpthread_rt.so
. No entanto, não há garantias de que ele não decifre seu código e coma seus jantares de TV.fonte
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.
(2) Verifique a existência da variável de ambiente do caminho da biblioteca dinâmica (
LD_LIBRARY_PATH
)se não houver nada a ser exibido, adicione um valor de caminho padrão (ou não, se desejar)
(3) Adicionamos o caminho do desejo, exportamos e experimentamos o aplicativo.
Observe que o caminho deve ser o diretório em que
path.so.something
está. Então, sepath.so.something
está em/my_library/path.so.something
, deve ser:source: http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html
fonte
find
sozinhos:find / -name the_name_of_the_file.so
LD_LIBRARY_PATH
deve apontar para o diretório que contémpath.so.something
, não parapath.so.something
si mesmo.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 .
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:
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/lib
e diretórios listados no/etc/ld.so.conf
e$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_PATH
ou mover a biblioteca para/usr/lib
. Então corraldconfig
.Para descobrir onde está a biblioteca, tente o seguinte:
(Substituir
libraryname
pelo nome da sua biblioteca)Se você seguir o
$LD_LIBRARY_PATH
caminho, coloque-o em seu~/.bashrc
arquivo para que ele seja executado sempre que você fizer login:fonte
.conf
meus 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.Eu tive um erro semelhante, eu poderia resolvê-lo dando,
Espero que isto ajude.
fonte
Você precisa garantir que você especifique o caminho da biblioteca durante a vinculação ao compilar seu arquivo .c:
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ê.
fonte
-Wl,-rpath DIR
.Tente adicionar
LD_LIBRARY_PATH
, o que indica caminhos de pesquisa, ao seu~/.bashrc
arquivoFunciona!
fonte
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.6
nos últimos 10 anos.fonte
adicione essas linhas no final
fonte
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.
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:
Verifique seu novo caminho de biblioteca:
Se isso mostrar os arquivos da sua biblioteca, você estará pronto.
fonte
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:
Agora
ls -l /lib
deve mostrar o link simbólico e o que ele aponta.fonte
Eu tive esse erro ao executar meu aplicativo com o Eclipse CDT no Linux x86.
Para corrigir isso:
Defina o caminho
fonte
Tudo o que eu precisava fazer era correr:
Eu estava na pasta localizada em
/usr/lib/x86_64-linux-gnu
e funcionou perfeitamente.fonte
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.
fonte
tente instalar o sudo lib32z1
fonte
O erro ocorre porque o sistema não pode se referir ao arquivo de biblioteca mencionado. Siga os seguintes passos:
locate libpthread_rt.so.1
listará o caminho de todos os arquivos com esse nome. Vamos supor que seja um caminho/home/user/loc
.cd home/USERNAME
. Substitua USERNAME pelo nome do usuário ativo atual com o qual você deseja executar o arquivo.vi .bash_profile
e no final doLD_LIBRARY_PATH
parâmetro, pouco antes.
, adicione a linha/lib://home/usr/loc:.
. Salve o arquivo.fonte
Eu recebi esse erro e acho que é o mesmo motivo que você
Tente isso. Corrija as permissões nos arquivos:
"Sudo su" para obter permissões no seu sistema de arquivos.
fonte
Eu recebi esse erro e acho que é o mesmo motivo que você
Tente isso. Corrija as permissões nos arquivos:
fonte
problema semelhante encontrado aqui: https://bugzilla.redhat.com/show_bug.cgi?id=1456202 Tentei a solução mencionada e ela realmente funciona.
As soluções nas perguntas anteriores podem funcionar. Mas acho que é uma maneira fácil de consertar. Tente reinstalar o pacote
libwbclient
no fedora:fonte
Eu uso o Ubuntu 18.04
A instalação do pacote "-dev" correspondente funcionou para mim,
Eu estava recebendo o erro abaixo até instalar o pacote acima,
fonte