Installation d'une bibliothèque localement dans le répertoire personnel, mais le programme ne la reconnaît pas

10

J'installe un programme sur un serveur en tant qu'utilisateur non root. Plus précisément, il s'agit de tmux 1.5, mais cela devrait s'appliquer à tous les programmes installés localement à mon avis (je mentionne le nom du programme au cas où ce problème ne serait pas ma propre erreur).

Le programme nécessite que j'installe certaines bibliothèques dépendantes (par exemple libevent et ncurses). Donc, je les ai installés tous les deux localement car je n'ai pas d'accès root

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

Maintenant, pour installer le programme, je devais également inclure les packages de bibliothèque:

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

Ok, donc cela installe le programme sans problème dans $ HOME / local / bin, mais si j'exécute l'exécutable: $ HOME / local / bin / tmux, j'obtiens l'erreur suivante:

tmux: erreur lors du chargement des bibliothèques partagées: libevent-2.0.so.5: impossible d'ouvrir le fichier d'objet partagé: aucun fichier ou répertoire de ce type

Il me semble que le programme ne trouve pas les bibliothèques souhaitées, mais le fichier libevent-2.0.so.5 existe bel et bien dans $ HOME / local / lib comme spécifié dans les options de configuration. Je me demande comment je peux faire en sorte que le programme reconnaisse la bibliothèque installée pour fonctionner. J'ai essayé de mettre des liens symboliques dans $ HOME / lib, $ HOME / bin et $ HOME / local / bin, mais rien de tout cela n'a fonctionné. Toutes les idées et suggestions seraient grandement appréciées

scicalculator
la source
Je suppose -R $DIR/libà CFLAGSest en construction tmux(et non libevent). Cela ne m'a pas aidé - il y a eu une dernière erreur de gcc disant qu'il ne peut pas reconnaître -R(aussi, j'ai essayé sans l'espace entre -Ret $DIR). ./configure --disable-shared Cela a fonctionné, la mise à jour a LD_LIBRARY_PATHégalement fonctionné. J'ai fini par libeventrefaire avec l' --disable-sharedoption ci-dessus .

Réponses:

20

Essayez de reconstruire libevent en utilisant

./configure --disable-shared

Je pense que cela résoudra votre problème car la bibliothèque sera liée lors de la construction du binaire et n'a pas besoin d'être recherchée lors de l'exécution.

Alternativement, si vous avez besoin d'un libevent lié dynamiquement, vous pouvez ajouter le répertoire contenant libevent-2.0.so.5 à votre variable d'environnement LD_LIBRARY_PATH:

export LD_LIBRARY_PATH=${HOME}/local/lib/:${LD_LIBRARY_PATH}
drootang
la source
Wow, merci beaucoup pour la réponse rapide. J'ai fini par utiliser LD_LIBRARY_PATH pour résoudre le problème car je pouvais simplement appliquer ce correctif à toutes les futures installations de bibliothèque et toujours utiliser le répertoire $ HOME / local. Appréciez l'aide!
scicalculator
2

Pas de chance avec les autres, mais cela a fonctionné pour moi, d' ici :

sudo ln -s /usr/local/lib/libevent-2.0.so.5 /usr/lib64/libevent-2.0.so.5
barbe
la source
2

J'ai posé une question similaire , assez intéressante aussi sur la construction tmuxde toutes choses (bien que je sois toujours certain que cela concerne à peu près n'importe quelle situation où GNU configureet makesont utilisés ensemble.

Je crois qu'une approche plus propre consiste à utiliser le soi-disant "rpath" - le chemin de recherche de bibliothèque intégré dans le binaire. Le -rpathcommutateur d'au moins l'éditeur de liens GNU ldspécifie le chemin.

La ligne de commande de construction se présenterait alors comme suit:

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

Pas vraiment primordial ici, mais PKG_CONFIG_PATHci-dessus est simplement la façon recommandée de faire ce que les gens réalisent autrement envoyer manuellement -L/path/to/libevent/lib -I/path/to/libevent/includeau ./configurescript. Lorsque vous générez libevent, il installe ses propres fichiers de configuration pour pkg-config(qui est utilisé par ./configure). Vous devriez l' utiliser, parce que libevent certainement sait ce qui passe doit être utilisé lors de la construction contre elle.

Quoi qu'il en soit, dans certaines situations, -rpathc'est une approche plus propre pour résoudre le problème.

LD_LIBRARY_PATHCependant, les solutions basées sur vous permettent de jongler avec la bibliothèque utilisée par votre binaire construit lors de l'exécution, ce qui est parfois souhaitable. Mais si vous voulez simplement construire avec une bibliothèque particulière que vous avez placée quelque part dans votre dossier de départ, je pense que les -rpathsolutions basées sur ce sont à considérer comme une réponse canonique.

Ce qui est étrange, c'est pourquoi tmuxles propres scripts de construction n'infèrent pas ce chemin à partir du chemin de recherche de bibliothèque pendant la construction. Peut-être qu'ils n'ont pas besoin et ne devraient pas, je ne sais pas. Est-ce une coïncidence que cela soit arrivé à nous qui construisons tmux?

amn
la source