Linux: bibliothèque standard C / C ++ statique vs liaison dynamic

Sur n’importe quel système d’exploitation, il est possible de comstackr une bibliothèque standard C ++ / C de manière statique ou dynamic. Sous Windows, je préfère toujours les versions statiques, car cela évite les problèmes de “dll hell” avec différentes versions de bibliothèques installées ou non sur des versions, éditions et service packs Windows spécifiques, etc. La liaison statique rend les logiciels plus portables et moins dépendants l’utilisateur final a fait avec son système d’exploitation (j’ai même vu des exemples où l’utilisateur pouvait faire SHIFT+DEL sur certaines DLL dans system32 , il ne pouvait pas expliquer pourquoi ou quand les utilisateurs affirment que mon application contient des virus) sur le site officiel de Microsoft …) Ainsi, sur Windows, le lien statique est généralement meilleur que dynamic. Cependant, je suis nouveau sur Linux, alors quelqu’un peut-il partager son expérience? Ma question est la suivante: quel type de lien (dynamic ou statique) est préconisé sur Linux si nous ignorons le fait que le système dynamic permet d’économiser de la mémoire et de l’espace disque et si nous prévoyons de dissortingbuer des logiciels avec un programme d’installation automatisé sont assez bon marché maintenant, donc il n’y a pas de raison de sacrifier des heures de travail nécessaires pour créer un programme d’installation vraiment bon et portable pour gagner quelques mégaoctets de RAM ou d’espace disque). Existe-t-il des problèmes spécifiques à Linux avec la liaison dynamic / statique?

Sous Linux, vous avez normalement un gestionnaire de paquets qui garantit qu’une seule version des bibliothèques est installée. Donc, normalement, il n’y a pas de problème avec les liens dynamics. La liaison dynamic est la méthode standard sur Linux.

Je dirais que la réponse dépend de la manière dont vous dissortingbuez le logiciel.

Si vous emballez le logiciel pour une dissortingbution Linux spécifique et une version, la liaison dynamic est généralement préférable. Vous savez quelles bibliothèques rechercher sur le système et vous pouvez spécifier des dépendances.

Cependant, si vous souhaitez dissortingbuer le logiciel sous la forme d’un fichier binary Linux fonctionnant sur “n’importe quel système” (tel que divers jeux ou logiciels tels que Matlab par exemple), vous vous retrouverez avec le même problème d’enfer que sur Windows. . Vous ne savez pas quelles versions de ces bibliothèques sont sur le système. Ainsi, vous devrez fournir vos propres fichiers .so ou un lien statique.

Voir tout l’intérêt d’utiliser la liaison dynamic est de réduire la taille des exécutables et de l’utilisation de la mémoire. Si vous négligez qu’il y a trop peu de choses à parler.

D’autre part, vous avez parlé d’économiser de la mémoire et de l’espace disque. Il est nécessaire d’économiser de l’espace disque car lorsque vous souhaitez exporter votre application / programme, vous ne pouvez pas télécharger une application 2Gb sur Internet (par exemple, la bibliothèque openCV est environ 2,1 Go). La solution consiste à les relier dynamicment et à ne charger que les modules qui vous sont nécessaires. Cela permet également un multitâche efficace (crée une seule copie du module et le programme entier utilise la même copie). particulièrement:

Par exemple, une application de lecteur multimédia peut être livrée avec un codec prenant en charge le format de fichier mp3. Si le lecteur multimédia était lié de manière statique, il ne serait pas possible de le mettre à jour dynamicment pour prendre en charge un format de fichier différent, sans remplacer l’ensemble de l’application. La liaison dynamic signifie qu’une nouvelle version de la bibliothèque partagée contenant un codec plus récent, comprenant des améliorations et des corrections de bogues, pourrait être chargée dynamicment par un éditeur de liens dynamic en mémoire au moment de l’exécution pour remplacer la bibliothèque partagée d’origine. Une bibliothèque partagée peut également être partagée par plusieurs applications. Par exemple, deux lecteurs multimédias différents peuvent utiliser la même bibliothèque partagée contenant le même codec. Cela signifie potentiellement que le périphérique exécutant l’application nécessite moins de mémoire physique, en fonction de la taille de l’éditeur de liens dynamic.

Troisièmement, sous Linux, tout est lié dynamicment à l’exception de /bin/ash.static qui a également sa version dynamic / bin / ash, mais cela ne doit pas vous empêcher de créer des liens statiques dans Linux. en utilisant gcc, la liaison est par défaut dynamic.Je suppose que vous devez utiliser l’indicateur “-static” pour lier statiquement les bibliothèques

@Vitaliy good que vous avez mentionné. L’important à noter ici est que la liaison intelligente et la création de bibliothèques partagées (ou dynamics) s’excluent mutuellement, c’est-à-dire que si vous activez la liaison intelligente, la création de bibliothèques partagées est tourné de.

La liaison intelligente divise le code en petits blocs de code et leurs dépendances sont chargées. Donc, si vous appelez plusieurs fois une dépendance, elle est chargée plusieurs fois. Cela donne un très bon temps d’exécution, mais un temps de compilation très élevé, surtout pour les grandes unités. Il y a donc un certain compromis.