Eu construí algumas bibliotecas a partir de fontes, e os arquivos depois make install
estão em/usr/local/lib
Por exemplo, no meu caso, tenho o arquivo libodb-2.2.so
que 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.
gdb
que teria ajudado de qualquer maneira com umlink
problema, 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 suficientegdb
, e o carregamento de bibliotecas.Respostas:
Para a sessão atual, você pode
ou para fazer a mudança permanente que você pode adicionar
/usr/local/lib
a/etc/ld.so.conf
(ou algo que inclui) e executarldconfig
como 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.fonte
man
páginaldd(1)
"No caso usual, o ldd chama o vinculador dinâmico padrão (consulteld.so(8)
) com aLD_TRACE_LOADED_OBJECTS
variável de ambiente definida como1
, 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 deldd
maio tente obter as informações de dependência executando diretamente o programa. Portanto, você nunca deve empregarldd
um 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 é: ... "$ objdump -p /path/to/program | grep NEEDED
"-L
e-rpath
durante 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.Se você já correu
ldconfig
após criar a biblioteca, continue lendo. Caso contrário, leia primeiro sobre o ldconfig ./usr/local/lib
pode não estar no caminho da biblioteca que o ldconfig usa. Você pode fazer isso: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.d
diretório. Nesse caso, adicione um arquivo (chame-o de "usr-local.conf" ou qualquer outra coisa) e coloque uma linha nele: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.fonte
/etc/ld.so.conf.d
sudoed ldconfig para levá-lo em consideração e meu executável pode começar agora.