2017-08-24 1 views
1

Dans mon répertoire lib, je vois que la plupart des liens d'objets partagés sont des cascades. Par exemple:C++ pourquoi enchaîner un lien d'objet partagé

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

Je sais que le lien de libctest.so est de rendre le drapeau -lctest compilation au travail, mais quel est le point d'avoir libctest.so.1?

Répondre

1

Je pense que vous avez écrit les filnames dans l'ordre inverse de la façon dont il est normalement affiché, vous auriez 3 fichiers

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 

Il est un système de versioning.

Une édition/installation particulière d'une bibliothèque a un nom de fichier complet, par ex. libctest.so.1.0, incorporé dans cette bibliothèque est le SONAME, un nom logique de la bibliothèque, par ex. libctest.so.1 qui est également utilisé comme lien symbolique vers le fichier réel.

Lors de la liaison d'un exécutable, la bibliothèque SONAME est ajoutée à l'exécutable. Ainsi, au moment de l'exécution, l'exécutable recherchera un nom de fichier de libctest.so.1. La convention consiste à faire en sorte que le SONAME de la bibliothèque reste le même tant qu'il est rétrocompatible, et de le changer lorsque des changements d'ABI incompatibles vers l'arrière sont introduits. Et comme vous le dites, l'éditeur de liens recherchera lib*.so lorsque vous effectuerez la liaison.

De cette manière, les exécutables (ou autres bibliothèques) liés à libctest.so.1 peuvent rester inchangés lorsque libctest est mis à niveau. Ainsi, lorsque vous pourriez avoir libctest version 1.1 est publiée, ces fichiers:

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

Exécutables toujours essayer de trouver libctest.so.1 et peut donc rester inchangé lorsque la bibliothèque est mise à niveau. La bibliothèque doit être écrite de sorte qu'elle soit rétrocompatible pour que cela fonctionne dans la pratique.

Si vous libérez une nouvelle bibliothèque incompatible, la convention est de changer le SONAME de cette bibliothèque, de sorte que vous finissez avec, par ex.

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

Cela soutient avoir plusieurs versions incompatibles d'une bibliothèque installée sur un système si différents exeucatbles ont besoin de différentes versions de cette bibliothèque.

+0

Si le nom du fichier 'so' actuel est' libctest.so.199', j'ai juste besoin de créer un lien 'libctest.so -> libctest.so.199', non? – user4016367

0

Les chiffres portent tous sur les versions. Cela signifie que vous pouvez facilement installer plusieurs versions d'une bibliothèque simultanément, et les applications liées à une version spécifique l'utiliseront (puisque l'éditeur de liens résout les liens du système de fichiers symbolique).