web-dev-qa-db-fra.com

Utilisation de ldconfig et ld.so.conf versus ld_library_path

Je construis souvent diverses bibliothèques du code source à jouer avec, telles que GMP-6.1.2, MPFR-4.0.1 et GCC-7.x. Ce faisant, je préfère utiliser --prefix=/usr/local/gcc-7.2.0 Donc, je sais exactement où il est installé et ne gâche pas les bibliothèques existantes. Et puis j'ai tout ce que je sais essentiellement, c'est ce que make install Me dit à la fin, à mettre à jour ou à définir LD_LIBRARY_PATH Et parfois mais pas toujours LD_RUN_PATH.

la plupart du temps, je viens de définir manuellement LD_LIBRARY_PATH Au besoin, ou la définir globalement dans quelque chose comme /etc/bash.bashrc.local et cela a fonctionné.

C'est ce que dit make install Dit:

Libraries have been installed in:
  /usr/local/mfprtest/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
  - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
    during execution
  - add LIBDIR to the 'LD_RUN_PATH' environment variable
    during linking
  - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
  - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.

Existe-t-il une meilleure façon, ou une voie plus agitée? d'utiliser ldconfig and ld.so.conf Que d'utiliser LD_LIBRARY_PATH Et LD_RUN_PATH Et PATH ? Ceci est spécifiquement pour écrire mon propre code, mais pourriez être pour d'autres utilisateurs, où je souhaite créer un lien avec diverses versions plus récentes d'une bibliothèque que celle installée avec une version Linux donnée, telle que GMP, MPFR, puis en utilisant diverses versions installées manuellement. de GCC tel que GCC-5.x ou GCC-6.x ou GCC-7.X.

fondamentalement, une fois que j'installe /usr/local/gcc-7.3.0 Par exemple, je veux moi-même et tout autre utilisateur qui écrit ou exécute un code source Grown C, C++ ou Fortran sur le système d'utiliser /usr/local/gcc-7.3.0 et pas le Versions système dans/usr/bin/and/usr/lib64 /

6
ron

La solution à cela consiste à ajouter vos répertoires de bibliothèque /usr/local/gcc-7.3.0/lib/ à /etc/ld.so.conf (ou un fichier dans /etc/ld.so.conf.d/) et exécuter ldconfig ou modifier les profils de coquille des utilisateurs pour remplacer les systèmes 'LD_LIBRARY_PATH/LD_RUN_PATH et ajouter l'individu */lib Entrées de sorte que la liaison puisse trouver les objets partagés.

Une fois que vous avez commencé à ajouter des bibliothèques, la complexité du maintien de ces augmentations, alors gardez cela à l'esprit.

Une autre option que vous avez est de relier tous les fichiers de /usr/local/<library>/{bin,lib,include} into /usr/local/{bin,lib,include}. Cela simplifie grandement le ld.so.conf ou LD_LIBRARY_PATH/LD_RUN_PATH Bien que vous devriez vivre avec Messy /usr/local/{bin,lib,include}.

Le moyen "officiel" de faire est d'utiliser le gestionnaire de packages du système et d'installer les versions maintenues de la distribution des bibliothèques dans les emplacements choisis (/usr/lib/, /lib, etc).

1
Pedro

Pour les exécutables (par opposition aux bibliothèques), les utilisateurs devront avoir un PATH correctement défini dans leur environnement. Cela peut être fait soit via leurs propres fichiers de démarrage shell, soit à l'échelle du système, par exemple via /etc/profile (MAIS Notez que ce fichier n'est pas garanti d'être lu sous toutes les configurations).

Maintenant, pour les bibliothèques, telles que GMP et MPFR:

  1. Si vous avez utilisé un chemin d'exécution lorsque vous construisez GCC, rien d'autre ne doit être fait pour pouvoir utiliser GCC: les bibliothèques seront trouvées via le chemin d'exécution.
  2. Sinon, ou si vous souhaitez que les utilisateurs puissent utiliser directement les bibliothèques à autre but (par exemple avec leur propre logiciel), utilisez-le, puis en utilisant ldconfig (et éventuellement /etc/ld.so.conf) peut être la meilleure solution. Mais notez que si les utilisateurs veulent compiler contre ces bibliothèques, ils auront également besoin de LIBRARY_PATH et CPATH (ou C_INCLUDE_PATH, etc.).

Noter: LD_LIBRARY_PATH est toujours utile pour des choses temporaires (E.G. Test) et des bibliothèques installées dans le répertoire de base de l'utilisateur (il ne semble pas y avoir l'équivalent à ldconfig pour la configuration de côté de l'utilisateur). Mais cela peut remplacer le chemin d'exécution , qui est un problème dans certains cas (par exemple pour make check Pour vérifier une bibliothèque qui vient d'être construite et pour laquelle une version précédente et compatible est déjà installée).

0
vinc17