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/lib
ao CFLAGS
.
Responder3
eu pergunteiuma pergunta semelhante, curiosamente também sobre a construção tmux
de todas as coisas, embora eu ainda tenha certeza de que isso não deveria se referir a qualquer situação em que GNU configure
e make
sejam usados juntos.
Acredito que uma abordagem mais limpa é utilizar o chamado "rpath" - o caminho de pesquisa da biblioteca incorporado no binário. A -rpath
troca de pelo menos o vinculador GNU ld
permite 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_PATH
acima está simplesmente a maneira recomendada de fazer o que as pessoas conseguiriam enviar manualmente -L/path/to/libevent/lib -I/path/to/libevent/include
para ./configure
o 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_PATH
soluçõ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 -rpath
as soluções baseadas em - devem ser consideradas uma resposta canônica.
O estranho é por que tmux
os 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