Use bibliotecas compartilhadas em / usr / local / lib

59

Eu construí algumas bibliotecas a partir de fontes, e os arquivos depois make installestão em/usr/local/lib

Por exemplo, no meu caso, tenho o arquivo libodb-2.2.soque está neste diretório.

No entanto, quando inicio o executável vinculado libodb, recebi o erro: error ao carregar bibliotecas compartilhadas:libodb-2.2.so: cannont open shared object file: No such file or directory.

Isso significa que eu construí meu executável não corretamente? ou devo indicar ao sistema que também pode haver algumas bibliotecas interessantes na pasta /usr/local/lib?

Estou usando o Ubuntu 12.04, Linux kernel 3.2.0-38-generic.

Stephane Rolland
fonte
Eu sugiro fortemente que você faça uma boa relação de amizade com seu depurador
DDS
@ DDS, sugiro que você elabore um pouco mais. Você sabe que é um site colaborativo aqui. Por favor, indique o caminho gdbque teria ajudado de qualquer maneira com um linkproblema, por exemplo. Eu sou genuinamente curioso. A princípio, sua observação não me parece relacionada ao problema. Mas eu posso estar errado. Na verdade, eu não sei o suficiente gdb, e o carregamento de bibliotecas.
Stephane Rolland
Desculpe ... esse comentário deveria ter sido colocado no stackoverflow na pergunta de um aluno sobre programação C ... só não vi foi U&L
DDS
@DDS Iniciante no aprendizado de programação C ou no aprendizado de construção no Linux? Por favor, seja mais preciso. Por exemplo, eu estava vindo do Windows. Isso não significa que eu não conheço C ++ ... Eu costumo pensar que seu comportamento crítico não é exato. Mesmo se estivesse no SO, seu comportamento logo chamará a atenção dos moderadores. Esteja ciente disso. Você está em um site colaborativo, de programadores entusiastas que compartilham conhecimentos úteis. Não em algum lugar projetado para lisonjear seu ego. (Não se preocupe, eu também fui gentil / razoavelmente agredido quando comecei o SO, e acho que foi uma coisa muito boa que aconteceu).
Stephane Rolland

Respostas:

59

Para a sessão atual, você pode

exportar LD_LIBRARY_PATH = / lib: / usr / lib: / usr / local / lib

ou para fazer a mudança permanente que você pode adicionar /usr/local/liba /etc/ld.so.conf(ou algo que inclui) e executar ldconfigcomo root.

Se você ainda estiver com problemas, a execução ldd [executable name]mostrará as bibliotecas que está tentando encontrar e quais não podem ser encontradas.

Flup
fonte
3
Na manpágina ldd(1)"No caso usual, o ldd chama o vinculador dinâmico padrão (consulte ld.so(8)) com a LD_TRACE_LOADED_OBJECTSvariável de ambiente definida como 1, o que faz com que o vinculador exiba as dependências da biblioteca. Lembre-se, no entanto, de que em algumas circunstâncias, algumas versões de lddmaio tente obter as informações de dependência executando diretamente o programa. Portanto, você nunca deve empregar lddum executável não confiável , pois isso pode resultar na execução de código arbitrário. Uma alternativa mais segura ao lidar com executáveis não confiáveis é: ... "
SlySven
4
"... $ objdump -p /path/to/program | grep NEEDED"
SlySven 07/04
Legal - nunca me deparei com objdump antes.
Flup
De acordo com este artigo, esta resposta é canonicamente incorreta e prejudicial . Para uma abordagem correta, o uso de -Le -rpathdurante a compilação para definir o caminho de pesquisa de vinculação e o caminho de pesquisa de tempo de execução para bibliotecas é o caminho correto, conforme esta pergunta e resposta.
Cliff Armstrong
37

Se você já correu ldconfigapós criar a biblioteca, continue lendo. Caso contrário, leia primeiro sobre o ldconfig .

/usr/local/libpode não estar no caminho da biblioteca que o ldconfig usa. Você pode fazer isso:

ldconfig /usr/local/lib

E o material deve ser adicionado ao cache do vinculador, mas provavelmente é melhor adicionar o caminho corretamente. Verifique se você tem um /etc/ld.so.conf.ddiretório. Nesse caso, adicione um arquivo (chame-o de "usr-local.conf" ou qualquer outra coisa) e coloque uma linha nele:

/usr/local/lib

Agora corra ldconfig. Se você não possui o diretório ld.so.conf.d, deve ter um /etc/ld.so.conf arquivo e pode adicionar essa linha ao final dele.

Cachinhos Dourados
fonte
3
Adicionei um arquivo custom.conf ao /etc/ld.so.conf.dsudoed ldconfig para levá-lo em consideração e meu executável pode começar agora.
precisa