2014-06-29 9 views
11

Ich versuche Caffe (http://caffe.berkeleyvision.org/installation.html) zu kompilieren und ich erhalte die folgenden Fehler:Ubuntu 12.04: ld kann nicht Bibliothek finden

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

Allerdings habe ich diese Bibliotheken installiert (libatlas). Mein LD_LIBRARY_PATH enthält den Pfad/usr/lib/atlas-base und enthält die Dateien libcblas.so und libatlas.so (und einige andere Dateien).

Warum kann ich diese Bibliotheken nicht finden? Danke.

Antwort

10

tl; dr:Caffe Make-Datei sucht nach libblas.so in /usr/lib. Wenn diese Datei fehlt, erstellt update-alternatives einen symbolischen Link /usr/lib/libblas.so an dem Ort, an dem sie installiert ist. Gleiches gilt für libcblas.so. LD_LIBRARY_PATH ist für die Laufzeit und hat damit nichts zu tun.


LD_LIBRARY_PATH hilft Ihnen nicht wirklich beim Kompilieren. Es stellt nur Verzeichnisse bereit, die nach freigegebenen Bibliotheken suchen, wenn sie Programme ausführen, die auf ihnen basieren, nach sie sind kompiliert. Beim Verbinden während der Kompilierung muss der Compiler diese gemeinsam genutzten Bibliotheken finden und zwar auf andere Weise als LD_LIBRARY_PATH.

Mehr auf den Punkt: wenn mit gcc oder clang kompiliert, die Verzeichnisse, in denen für die Bibliotheken zu suchen, mit zu verbinden sind, um den -L Flag versehen mit, und es nicht betrachtet die LD_LIBRARY_PATH Umgebungsvariable.

Gemeinsame Standorte für libblas.so sind /usr/lib/atlas-base/ und /usr/lib/libblas/. Die Makefile für caffe tut nichts besonderes, um zu versuchen, diese Unterverzeichnisse zu finden, und setzt voraus, dass sich diese Bibliotheken im Standardbibliotheksverzeichnis /usr/lib/ befinden. In der Regel existiert ein symbolischer Link /usr/lib/libblas.so und verweist auf den tatsächlichen Speicherort der gemeinsam genutzten Bibliothek. Aus irgendeinem Grund war dies in Ihrer anfänglichen Konfiguration nicht der Fall.

Wenn es um mehrere Alternativen für Pakete geht, ist update-alternatives praktisch. Im Fall libblas.so können Sie problemlos zwischen mehreren Implementierungen (libblas, openblas), die Sie möglicherweise installiert haben, wechseln, indem Sie die symbolischen Links ändern.

sudo update-alternatives --config libblas.so erstellt diese symbolische Verbindung, wenn es fehlte, was wiederum den Compiler finden die gemeinsame Bibliothek finden, Ihr Problem zu lösen. Dies wird durch die Ausgabe des Befehls angezeigt:

$ 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. 

gleiche Art von Argumentation libcblas.so gilt.

5

Es stellt sich heraus, dass ich

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

und wählen libatlas laufen mussten. Ich habe keine Ahnung warum. Wenn mir jemand das erklären kann, werde ich ihm die Antwort geben. Danke.

4

Als Ergänzung zu @Rans Antwort hat Ubuntu insbesondere eine seltsame Paketstruktur für das, was mit Caffe benötigt wird.Ich bin gerade auf diesen Post gestoßen, als ich das gleiche Problem auf meiner eigenen Maschine behoben habe, und hier ist eine Hilfe, wenn andere stecken bleiben. (Ubuntu 14.04).

libatlas-dev hat keine libatlas-base-dev als Abhängigkeit! Caffe scheint die Bibliotheken nur von letzterem zu mögen. Es installieren.

Führen Sie dann die von @Ran vorgeschlagenen Befehle aus und wählen Sie die Bibliotheken aus dem Verzeichnis atlas-base unter/usr/lib aus. Wenn nur libatlas-dev installiert ist, wird update-alternatives die Ausgabe am unteren Rand von @ swalogs Beitrag haben, verbindet aber nicht wirklich eine Atlas-Bibliothek, die Caffe zu genehmigen scheint! Es muss der von Atlas-Base sein. Hoffe das hilft!

+0

Das funktioniert! Vielen Dank – mcExchange