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

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

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

O programa exige que eu instale algumas bibliotecas dependentes (por exemplo, libevent e ncurses). Então, instalei os dois localmente porque 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 tive que 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: erro ao carregar bibliotecas compartilhadas: libevent-2.0.so.5: não é possível abrir o arquivo de objeto compartilhado: esse arquivo ou diretório não existe

Parece-me que o programa não consegue encontrar as bibliotecas desejadas, mas o arquivo libevent-2.0.so.5 realmente existe em $HOME/local/lib conforme especificado nas opções de configuração. Estou me perguntando como posso fazer com que o programa reconheça a biblioteca instalada para ser executado. Tentei colocar links simbólicos em $HOME/lib, $HOME/bin e $HOME/local/bin, mas nenhum deles funcionou. Quaisquer ideias e sugestões serão muito apreciadas

Responder1

Tente reconstruir o libevent usando

./configure --disable-shared

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

Como alternativa, se você precisar de um libevent vinculado dinamicamente, poderá adicionar o diretório que contém libevent-2.0.so.5 à sua variável de ambiente LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}

Responder2

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

Basta adicionar -R $DIR/libao CFLAGS.

Responder3

eu pergunteiuma pergunta semelhante, curiosamente também sobre a construção tmuxde todas as coisas, embora eu ainda tenha certeza de que isso não deveria se referir a qualquer situação em que GNU configuree makesejam usados ​​juntos.

Acredito que uma abordagem mais limpa é utilizar o chamado "rpath" - o caminho de pesquisa da biblioteca incorporado no binário. A -rpathtroca de pelo menos o vinculador GNU ldpermite especificar o "rpath".

A linha de comando de construção ficaria assim:

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

Não é realmente fundamental aqui, mas PKG_CONFIG_PATHacima está simplesmente a maneira recomendada de fazer o que as pessoas conseguiriam enviar manualmente -L/path/to/libevent/lib -I/path/to/libevent/includepara ./configureo script. Quando você cria o libevent, ele instala seus próprios arquivos de configuração pkg-config(que são usados ​​pelo ./configure). Você deve usá-lo, porque sólibevent definitivamentesabe quais opções devem ser usadas ao construir contra ele.

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

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

O estranho é por que tmuxos próprios scripts de construção não inferem esse caminho do caminho de pesquisa da biblioteca durante a construção. Talvez não precisem e não devam, não sei. É uma coincidência que isso tenha acontecido conosco que construímos tmux?

Responder4

Não tive sorte com os outros, mas funcionou para mim, desdeaqui:

sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5

informação relacionada