Eu tenho um executável que precisa vincular libtest.so
dinamicamente, então eu os coloco no mesmo diretório e, em seguida:
cd path_to_dir
./binary
Mas entendi:
error while loading shared libraries: libtest.so: cannot open shared object file: No such file or directory
Como ele não consegue encontrar o libtest.so
que já está no mesmo diretório que o próprio executável?
linux
autoloader
linuxer
fonte
fonte
echo $LD_LIBRARY_PATH
está vazio na minha máquina :(:
), não um ponto e vírgula.Embora você possa definir LD_LIBRARY_PATH para permitir que o vinculador dinâmico saiba onde procurar, há opções melhores. Você pode colocar sua biblioteca compartilhada em um dos locais padrão, consulte
/etc/ld.so.conf
(no Linux) e/usr/bin/crle
(no Solaris) para obter a lista desses locaisVocê pode passar
-R <path>
para o vinculador ao criar seu binário, que será adicionado<path>
à lista de diretórios verificados para sua biblioteca compartilhada. Aqui está um exemplo. Primeiro, mostrando o problema:libtest.h:
libtest.c:
hello.c:
Makefile (as guias devem ser usadas):
Vamos executá-lo:
Como corrigi-lo? Adicione
-R <path>
aos sinalizadores do vinculador (aqui, configurandoLDFLAGS
).Olhando para o binário, você pode ver que ele precisa
libtest.so.0
:O binário procurará suas bibliotecas, além dos locais padrão, no diretório especificado:
Se você deseja que o binário procure no diretório atual, pode configurar o RPATH para
$ORIGIN
. Isso é um pouco complicado, porque você precisa garantir que o cifrão não seja interpretado pelo make. Aqui está uma maneira de fazer isso:fonte
make
, como ao chamar manualmenteg++
, tente-Wl,-rpath='$ORIGIN'
(observe as aspas simples) para impedir a$ORIGIN
expansão para uma sequência vazia.Para carregar os objetos compartilhados do mesmo diretório que o executável, basta executar:
Nota: Não modificará a variável LD_LIBRARY_PATH do seu sistema. A alteração afeta apenas a isso e somente a execução do seu programa.
fonte
Para quem ainda luta sem resposta, encontrei uma com a seguinte sugestão:
Você pode tentar atualizar o ld.so.cache usando:
sudo ldconfig -v
Trabalhou para mim.
fonte
Para qualquer pessoa que use o CMake para sua compilação, você pode definir
CMAKE_EXE_LINKER_FLAGS
o seguinte:Isso propaga adequadamente os sinalizadores do vinculador para todos os tipos de compilação (por exemplo, Debug, Release, etc ...) para procurar arquivos .so no diretório de trabalho atual primeiro.
fonte
O vinculador dinâmico decidirá onde procurar por bibliotecas. No caso do Linux, o vinculador dinâmico geralmente é
GNU ld.so
(ou uma alternativa que normalmente se comportará idêntica por motivos de compatibilidade).Para citações da Wikipedia:
Fonte: https://en.wikipedia.org/wiki/Rpath
fonte