Por que eu tenho para definir LD_LIBRARY_PATH com uma exportação cada vez que eu executar o meu aplicativo?

StackOverflow https://stackoverflow.com/questions/695530

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/"
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top