Instalando uma biblioteca localmente no diretório home, mas o programa não a reconhece

10

Estou instalando um programa em um servidor como um usuário não raiz. Especificamente, ele é o tmux 1.5, mas isso deve se aplicar amplamente a todos os programas instalados localmente, na minha opinião (eu menciono o nome do programa caso esse problema acabe não sendo meu próprio erro).

O programa requer que eu instale algumas bibliotecas dependentes (por exemplo, libevent e ncurses). Então, instalei os dois localmente, pois não tenho acesso root

cd $HOME/library/installation/folder
DIR=$HOME/local
./configure --prefix=$DIR 
#... make ... make install 

Agora, para instalar o programa, também precisei incluir os pacotes da biblioteca:

cd $HOME/program/installation/folder
./configure --prefix=$DIR CFLAGS="-I$DIR/include" LDFLAGS="-L$DIR/lib"
#... make ... make install 

Ok, isso instala o programa sem problemas em $ HOME / local / bin, mas se eu executar o executável: $ HOME / local / bin / tmux, recebo o seguinte erro:

tmux: error while loading shared libraries: libevent-2.0.so.5: cannot open shared object file: No such file or directory

Parece-me que o programa não pode encontrar as bibliotecas desejadas, mas o arquivo libevent-2.0.so.5 de fato existe em $ HOME / local / lib conforme especificado nas opções de configuração. Eu estou querendo saber como posso obter o programa para reconhecer a biblioteca instalada para executar. Eu tentei colocar links simbólicos em $ HOME / lib, $ HOME / bin e $ HOME / local / bin, mas nenhum deles funcionou. Quaisquer idéias e sugestões seriam muito apreciadas

    
por scicalculator 18.08.2011 / 03:00

4 respostas

18

Tente recriar o libevent usando

./configure --disable-shared

Eu suspeito que isso consertará seu problema porque a biblioteca será vinculada ao construir o binário e não precisa ser pesquisada em tempo de execução.

Alternativamente, se você precisa de um libevent vinculado dinamicamente, você pode adicionar o diretório contendo libevent-2.0.so.5 à sua variável de ambiente LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}
    
por 18.08.2011 / 03:19
7

Você também pode definir o RPATH, que codifica o patch de pesquisa da biblioteca no próprio binário .

Basta adicionar -R $DIR/lib a CFLAGS .

    
por 18.08.2011 / 03:23
2

Sem sorte com os outros, mas isso funcionou para mim, de aqui :

sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
    
por 23.10.2013 / 15:54
2

Eu pedi uma questão semelhante , curiosamente também sobre a criação de tmux de todas as coisas (embora eu ainda esteja certo de que isso se aplica a qualquer situação onde o GNU configure e make são usados juntos.

Eu acredito que uma abordagem mais limpa é utilizar o chamado "rpath" - o caminho de busca da biblioteca embutido no binário. A opção -rpath de pelo menos o vinculador GNU ld especifica o caminho.

A linha de comando de compilação teria a seguinte aparência:

PKG_CONFIG_PATH=/path/to/libevent/lib/pkg-config LDFLAGS=-Wl,-rpath,/path/to/libevent/lib ./configure ...

Não é realmente importante aqui, mas PKG_CONFIG_PATH acima é simplesmente a maneira recomendada de fazer o que as pessoas realizam manualmente enviando -L/path/to/libevent/lib -I/path/to/libevent/include para ./configure script. Quando você cria libevent , ele instala seus próprios arquivos de configuração para pkg-config (que é usado por ./configure ). Você deve usá-lo, porque apenas libevent definitivamente sabe quais switches devem ser usados ao construir contra ele.

De qualquer forma, em algumas situações, -rpath é uma abordagem mais limpa para resolver o problema.

As soluções

LD_LIBRARY_PATH -based, no entanto, permitem que você concilie a biblioteca usada pelo seu binário construído em tempo de execução, o que às vezes é desejável. Mas se você quiser apenas construir uma biblioteca específica que tenha colocado em um local dedicado em sua pasta pessoal em algum lugar, acho que as soluções baseadas em -rpath devem ser consideradas uma resposta canônica.

O mais estranho é porque os scripts de compilação do tmux 'não inferem esse caminho do caminho de pesquisa da biblioteca durante a compilação. Talvez eles não precisem e não devam, eu não sei. É uma coincidência que isso tenha acontecido para nós que construímos tmux ?

    
por 21.06.2015 / 15:24