Por que eu tenho para definir LD_LIBRARY_PATH com uma exportação cada vez que eu executar o meu aplicativo?
-
22-08-2019 - |
Pergunta
Eu tenho algum código que usa algumas bibliotecas compartilhadas (código c no gcc). Ao compilar eu tenho que definir explicitamente a incluir e diretórios de bibliotecas usando -I e -L, uma vez que não estão nos lugares comuns. Quando tento executar o código, eu recebo o seguinte erro:
./sync_test
./sync_test: error while loading shared libraries: libsync.so: cannot open shared object file: No such file or directory
No entanto, fazer o seguinte, tudo funciona muito bem:
export LD_LIBRARY_PATH="/path/to/library/"
./sync_test
Agora, a parte estranha é que este só funciona uma vez. Se eu tentar e correr sync_test novamente eu recebo o mesmo erro a menos que eu executar o comando de exportação em primeiro lugar. Eu tentei adicionar o seguinte ao meu .bashrc, mas isso não fez diferença:
LD_LIBRARY_PATH="/path/to/library/"
Solução
Use
export LD_LIBRARY_PATH="/path/to/library/"
em seu .bashrc caso contrário, ele só vai estar disponível para bash e não quaisquer programas que você começar.
Tente bandeira -R/path/to/library/
quando você está ligando, ele vai fazer o olhar programa nesse diretório e você não precisará definir as variáveis ??de ambiente.
EDIT:. Looks como -R
é Solaris somente, e você está no Linux
Uma maneira alternativa seria adicionar o caminho para /etc/ld.so.conf
e ldconfig
prazo. Note-se que esta é uma mudança global que será aplicado a todos os binários ligados dinamicamente.
Outras dicas
Você deve evitar configuração LD_LIBRARY_PATH
em sua .bashrc
. Consulte "Why LD_LIBRARY_PATH is bad
" para obter mais informações.
Use a opção vinculador -rpath ao ligar para que o vinculador dinâmico sabe onde encontrar libsync.so
durante a execução.
gcc ... -Wl,-rpath /path/to/library -L/path/to/library -lsync -o sync_test
EDIT:
Outra forma seria usar um invólucro como este
#!/bin/bash
LD_LIBRARY_PATH=/path/to/library sync_test "$@"
Se sync_test
começa quaisquer outros programas, eles podem acabar usando os libs em /path/to/library
que pode ou não pode ser destinados.
Você quis 'exportação' em seu .bashrc?
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"
Você pode simplesmente colocar tudo isso em uma linha:
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" ./sync_test
Deve tornar as coisas um pouco mais fácil, mesmo que isso não muda nada fundamentais
Em vez de substituir o caminho de busca da biblioteca em tempo de execução com LD_LIBRARY_PATH, você poderia, em vez cozê-lo no próprio binário com rpath
. Se você ligar com GCC -Wl,-rpath,<libdir>
acrescentando deve fazer o truque, se você ligar com ld é apenas -rpath <libdir>
.
O que você também pode fazer, se é que você algo instalado em seu sistema, é adicionar o diretório que contém as bibliotecas compartilhadas para o seu /etc/ld.so.conf arquivos, ou fazer uma novo arquivo no /etc/ld.so.conf.d /
(Eu tenho tanto verificada distribuição RHEL5 e Ubuntu então eu acho que é genérico para linux)
O programa ldconfig irá se certificar que estão em todo o sistema incluído.
Consulte o seguinte link para mais informações: www.dwheeler.com/secure-programs/Secure-Programs- HOWTO / dlls.html
Você pode adicionar em seu código um sistema de chamada com a nova definição:
sprintf(newdef,"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:%s:%s",ld1,ld2);
system(newdef);
Mas, eu não sei que é a solução rigth mas funciona.
Saudações