web-dev-qa-db-fra.com

Ubuntu 12.04: ld ne trouve pas de bibliothèque

J'essaie de compiler Caffe ( http://caffe.berkeleyvision.org/installation.html ) et j'obtiens les erreurs suivantes:

/usr/bin/ld: cannot find -lcblas
/usr/bin/ld: cannot find -latlas

Cependant, j'ai ces bibliothèques installées (libatlas). Mon LD_LIBRARY_PATH contient le chemin/usr/lib/atlas-base et il contient les fichiers libcblas.so et libatlas.so (et quelques autres fichiers également).

Pourquoi ld ne trouve pas ces bibliothèques? Merci.

13
Ran

tl; dr:Caffe makefile recherche libblas.so dans /usr/lib. S'il manque, update-alternatives crée un lien symbolique /usr/lib/libblas.so à l'emplacement où il est installé. Il en va de même pour libcblas.so. LD_LIBRARY_PATH est destiné à l'exécution et n'a rien à voir avec cela.


LD_LIBRARY_PATH ne vous aide pas vraiment lors de la compilation. Il fournit uniquement des répertoires pour rechercher des bibliothèques partagées lors de l'exécution de programmes qui en dépendent, après leur compilation. Pourtant, lors de la liaison pendant la compilation, le compilateur doit trouver ces bibliothèques partagées, et le fait par d'autres moyens que LD_LIBRARY_PATH.

Plus précisément: si vous compilez avec gcc ou clang, les répertoires dans lesquels rechercher les bibliothèques à lier sont fournis à l'aide du -L flag, et il ne prend pas en compte le LD_LIBRARY_PATH variable d'environnement.

Emplacements communs pour libblas.so sont /usr/lib/atlas-base/ et /usr/lib/libblas/. Le Makefile pour caffe ne fait rien de particulier pour essayer de localiser ces sous-répertoires et repose sur le fait que ces bibliothèques se trouvent dans le répertoire de bibliothèque par défaut /usr/lib/. Généralement, un lien symbolique /usr/lib/libblas.so existe et pointe vers l'emplacement réel de la bibliothèque partagée. Pour une raison quelconque, ce n'était pas le cas dans votre configuration initiale.

Lorsqu'il s'agit de plusieurs alternatives pour les packages, update-alternatives est très pratique. Dans le cas de libblas.so il vous permet de basculer facilement entre plusieurs implémentations (libblas, openblas) que vous avez peut-être installées, et cela en changeant les liens symboliques.

Sudo update-alternatives --config libblas.so a créé ce lien symbolique lorsqu'il était manquant, ce qui a permis au compilateur de trouver la bibliothèque partagée, résolvant ainsi votre problème. Ceci est indiqué par la sortie de la commande:

 $ Sudo update-alternatives --config libblas.so
There is only one alternative in link group libblas.so (providing /usr/lib/libblas.so): /usr/lib/libblas/libblas.so
Nothing to configure.

Le même type de raisonnement s'applique à libcblas.so.

11
swalog

Sudo apt-get install libatlas-base-dev a fonctionné pour moi, il a supprimé les deux dépendances manquantes.

Voir ce fil pour plus de détails https://github.com/BVLC/caffe/issues/559

6
Mar Cnu

Il s'est avéré que je devais courir

Sudo update-alternatives --config libblas.so
Sudo update-alternatives --config liblapack.so

et pour sélectionner libatlas. Je ne sais pas pourquoi,. Si quelqu'un peut m'expliquer cela, je lui donnerai la réponse. Merci.

5
Ran

En complément de la réponse de @ Ran, Ubuntu en particulier a une structure de package étrange pour ce qui est nécessaire avec Caffe. Je viens de tomber sur ce post en résolvant ce même problème sur ma propre machine, et voici de l'aide si d'autres sont bloqués. (Ubuntu 14.04).

libatlas-dev N'a PAS libatlas-base-dev comme dépendance! Caffe semble n'aimer que les bibliothèques de ce dernier. Installez-le.

Ensuite, exécutez les commandes suggérées par @Ran et sélectionnez les bibliothèques dans le répertoire atlas-base sous/usr/lib. Avec juste libatlas-dev installé, les alternatives de mise à jour auront la sortie au bas du message de @ swalog, mais ne lient pas réellement une bibliothèque d'atlas que caffe semble approuver! Ce doit être celui d'Atlas-Base. J'espère que cela t'aides!

4
Drew Sabelhaus