2017-08-24 4 views
1

In meinem lib-Verzeichnis sehe ich die meisten der gemeinsamen Objektverknüpfung sind Kaskaden. Zum Beispiel:C++ warum kaskadierte gemeinsame Objektverknüpfung

libctest.so.1.0 -> libctest.so.1 
libctest.so.1 -> libctest.so 

weiß, dass ich die Verbindung von libctest.so ist das Kompilierung-Flag -lctest arbeitet zu machen, aber was ist der Sinn von libctest.so.1 zu haben?

Antwort

1

Ich glaube, Sie die filnames in umgekehrter Reihenfolge geschrieben, wie es normalerweise angezeigt wird, würden Sie 3 Dateien

libctest.so.1.0 (library file) 
libctest.so.1 -> libctest.so.1.0 (symlink to the libctest.so.1.0 file) 
libctest.so -> libctest.so.1  (symlink to the libctest.so.1 symlink 

Es ist ein Versionsschema.

Eine bestimmte Veröffentlichung/Installation einer Bibliothek hat einen vollständigen Dateinamen, z. libctest.so.1.0, in diese Bibliothek eingebettet ist die SONAME, ein logischer Name der Bibliothek, z.B. libctest.so.1, das auch als Symlink zur eigentlichen Datei verwendet wird.

Beim Verknüpfen einer ausführbaren Datei wird die Bibliothek SONAME zur ausführbaren Datei hinzugefügt, sodass die ausführbare Datei zur Laufzeit nach dem Dateinamen libctest.so.1 sucht. Die Konvention besteht darin, den SONAME einer Bibliothek so lange unverändert zu lassen, wie er rückwärtskompatibel ist, und ihn zu ändern, wenn rückwärts inkompatible ABI-Änderungen eingeführt werden.

Und wie Sie sagen, wird der Linker nach lib*.so suchen, wenn Sie die Verknüpfung machen.

Auf diese Weise können ausführbare Dateien (oder andere Bibliotheken), die mit libctest.so.1 verknüpft sind, unverändert bleiben, wenn libctest aktualisiert wird. Wenn also libctest Version 1.1 freigegeben wird, können Sie diese Dateien haben:

libctest.so.1.1 
libctest.so.1 -> libctest.so.1.1 
libctest.so -> libctest.so.1 

Executables noch libctest.so.1 zu lokalisieren versuchen und kann daher unverändert bleiben, wenn die Bibliothek aktualisiert wird. Die Bibliothek muss so geschrieben werden, dass sie rückwärtskompatibel ist, damit dies in der Praxis funktioniert.

Wenn Sie eine neue rückwärtskompatible Bibliothek freigeben, besteht die Konvention darin, den SONAME dieser Bibliothek zu ändern, sodass Sie z.

libctest.so.2.0 
libctest.so.2 -> libctest.so.2.0 

Dies unterstützt mehrere inkompatible Versionen einer Bibliothek auf einem System installiert haben, wenn unterschiedliche exeucatbles verschiedene Versionen dieser Bibliothek benötigen.

+0

Wenn der Name der tatsächlichen 'so' Datei' libctest.so.199' ist, muss ich nur einen Link erstellen 'libctest.so -> libctest.so.199', richtig? – user4016367

0

Bei den Zahlen dreht sich alles um die Versionierung. Dies bedeutet, dass Sie problemlos mehrere Versionen einer Bibliothek gleichzeitig installieren können, und Anwendungen, die mit einer bestimmten Version verknüpft sind, verwenden dies (da der Linker die symbolischen Dateisystemverbindungen auflöst).

Verwandte Themen