So habe ich mehrere gemeinsame Bibliotheken, die ich versuche, auf meinem Ubuntu-System dauerhaft zu installieren, aber ich habe einige Schwierigkeiten damit.shared library nicht während der Kompilierung gefunden
Ich mag die Bibliotheken und die Header in einem separaten Ordner unter /usr/local/lib
und /usr/local/include
(zum Beispiel eines Ordner agony
genannt) installieren, so wäre es sauber sein und sie würde das Entfernen nur verlangen, dass ich diese Ordner löscht. so sieht es etwa so aus:
/usr/local/lib/agony/libbtiGPIO.so
/usr/local/lib/agony/libbtiDSP.so
...
/usr/local/include/agony/GPIO.h
/usr/local/include/agony/DSP.h
...
Und fügte ich eine Datei hier /etc/ld.so.conf.d/agony.conf
, welche umfassen eine Linie beschreibt den Pfad zum Bibliotheksordner:
$ cat /etc/ld.so.conf.d/agony.conf
/usr/local/lib/agony
und ich führen sudo ldconfig
die Bibliothek Datenbank zu aktualisieren. So zu überprüfen, ob die Bibliothek gefunden wird, ich ldconfig -p | grep bti*
und sehe ich folgendes Ergebnis:
$ ldconfig -p | grep bti
...
libbtiGPIO.so (libc6,x86-64) => /usr/local/lib/agony/libbtiGPIO.so
libbtiDSP.so (libc6,x86-64) => /usr/local/lib/agony/libbtiDSP.so
...
An dieser Stelle sollte ich in der Lage sein, die Bibliotheken zu verwenden, ohne den Bibliothekspfad angeben. Wenn ich jedoch versuche, eine Anwendung zu kompilieren, ohne den Bibliothekspfad (-L) anzugeben, schlägt sie fehl. Allerdings, wenn ich gcc
mit dem Bibliothekspfad ex liefern:
gcc source.c -L /usr/local/lib/agony output -lbtiGPIO -lbtiDSP
es funktioniert !!
Ich möchte nicht LD_LIBRARY_PATH
Umgebungsvariable verwenden, weil diese Bibliothek überall auf dem System verwendet werden soll und ich möchte nicht, dass andere Compiler sich Sorgen um die Bereitstellung LD_LIBRARY_PATH
.
Was mache ich hier falsch?
Danke für das Aufräumen Mike. Wenn ich zum Beispiel eine 3rd-Party-Bibliothek mit apt-get installiere, muss sie die shared libraries und irgendwo wie '/ usr/lib' installieren, da ich den Bibliothekspfad nicht angeben, wenn ich diese Bibliotheken verwende. Was ist, wenn der Name der Drittanbieterbibliotheken mit dem eines anderen auf dem System identisch ist? Dies scheint vom ersten Eindruck an ein wirklich schlechtes Design zu sein. – ArmenB
@ Bloody-Band-Aid Ein Paket kann nicht in die Paket-Feeds der Distro mit dem gleichen Namen wie der vorherige gelangen. Die Distribution steuert ihren Paketnamespace. Wenn ich ein Quellpaket außerhalb der Kontrolle des Paketmanagers installiere, wird es standardmäßig unter '/ usr/local', außerhalb des Bereichs der Distribution installiert. Jedes Problem, das ich bei nicht verwalteten Installationen habe, ist mein eigener Kopfschmerz. Die Installation von zwei Bibliotheken mit demselben Namen im selben Installationspräfix kann nicht durchgeführt werden. Ich könnte sie auf verschiedene Installationspräfixe installieren, '/ usr/local/fooA','/usr/local/fooB', aber das wäre verrückt. –