Ich versuche, eine Verknüpfung mit einer gemeinsam genutzten Bibliothek herzustellen, die mehrere verschiedene Implementierungen hat. Insbesondere bieten Blas, Openblas und Atlas alle dieselbe Binärschnittstelle über die /usr/lib/libblas.so
Alternative auf Ubuntu 14.04 (und ein ähnliches, aber nicht identisches Setup auf 12.04). Wenn ich GCC verwende, -lblas
scheint der Linker tatsächlich über den alternativen Link zur tatsächlichen Implementierung aufzulösen. Wenn ich also beispielsweise Openblas installiert habe, wird es mit der tatsächlichen Openblas-Binärdatei verknüpft. Wenn ich dann die resultierende ausführbare Datei auf einem System installiere, auf dem Atlas installiert ist, kann der dynamische Linker die Bibliothek nicht laden, da er den alternativen Link nicht sieht.
Gibt es eine Möglichkeit, GCC dazu zu bringen, den „alternativen“ symbolischen Link als DL-Ziel zu verwenden, damit es tatsächlich wie vorgesehen funktioniert update-alternatives
?
Antwort1
Die Auflösung symbolischer Links ist hier eine Funktion. Durch die Auflösung libblas.so
in libblas.so.3
wird die resultierende ausführbare Datei an eine bestimmte So-Version gebunden. (Änderungen an der So-Version, also 3
in , libblas.so.3
treten auf, wenn sich die binäre Schnittstelle der Bibliothek abwärtsinkompatibel ändert, daher ist dies erwünscht.
Das Problem scheint zu sein, dass Ihr Zielsystem nicht über einen verfügt libblas.so.3
, daher empfehle ich Folgendes:
libblas.so.3
Stellen Sie sicher, dass Ihre Anwendung , wie bereits geschehen, mit verknüpft ist .Erstellen Sie auf dem Zielsystem einen symbolischen Link von der eigentlichen libblas.so zum erforderlichen
libblas.so.3
Namen, sodass dieser symbolische Link im LD_LIBRARY_PATH gefunden wird:mkdir ./mylib ln -s /usr/lib/libblas.so ./mylib/libblas.so.3 LD_LIBRARY_PATH=$PWD/mylib:$LD_LIBRARY_PATH ./myexecutable