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


10

Estou instalando um programa em um servidor como um 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 (mencionei 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, eu 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, eu 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, então isso instala o programa sem problemas no $ 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: Não existe esse arquivo ou diretório

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. Gostaria de saber como posso obter o programa para reconhecer a biblioteca instalada para executar. Tentei colocar links simbólicos em $ HOME / lib, $ HOME / bin e $ HOME / local / bin, mas nenhum deles funcionou. Todas as idéias e sugestões seriam muito apreciadas


Presumo -R $DIR/libque CFLAGSé enquanto constrói tmux(e não libevent). Isso não me ajudou - houve um erro final do gcc dizendo que ele não pode reconhecer -R(também tentei sem o espaço entre -Re $DIR). ./configure --disable-shared Isso funcionou, atualizando o LD_LIBRARY_PATHtambém funcionou. Acabei fazendo libeventnovamente com a --disable-sharedopção acima .

Respostas:


20

Tente recriar o libevent usando

./configure --disable-shared

Eu suspeito que isso resolverá o seu problema porque a biblioteca será vinculada ao criar 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 contendo libevent-2.0.so.5 à sua variável de ambiente LD_LIBRARY_PATH:

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

Uau, muito obrigado pela resposta rápida. Acabei usando LD_LIBRARY_PATH para corrigir o problema, pois eu poderia simplesmente aplicar essa correção a qualquer instalação futura da biblioteca e sempre usar o diretório $ HOME / local. Agradecemos a ajuda!
Scicalculator


2

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

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

2

Fiz uma pergunta semelhante , curiosamente, também sobre a construção tmuxde todas as coisas (embora eu ainda esteja certo de que isso se refere a praticamente qualquer situação em que o GNU configuree makesejam usados ​​juntos.

Eu acredito que uma abordagem mais limpa é utilizar o chamado "rpath" - o caminho de pesquisa da biblioteca incorporado no binário. A -rpathopção de pelo menos o vinculador GNU ldespecifica o caminho.

A linha de comando de construção ficaria da seguinte maneira:

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 é simplesmente a maneira recomendada de fazer o que as pessoas alcançam enviando manualmente -L/path/to/libevent/lib -I/path/to/libevent/includepara o ./configurescript. Quando você constrói libevent, ele instala seus próprios arquivos de configuração para pkg-config(o que é usado por ./configure). Você deve usá-lo, porque sabe com libevent certeza quais switches devem ser usados ​​ao criar contra ele.

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

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

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.