Question

Je vais commencer un nouveau projet C ++ qui reposera sur une série de bibliothèques, y compris une partie des bibliothèques Boost, le log4cxx ou la bibliothèque de journalisation google - et que le projet évolue autres aussi (que je ne peux pas encore anticiper).

Il devra fonctionner sur les systèmes 32 et 64 bits, plus probablement dans un environnement Linux très diversifié où je ne vous attendez pas à avoir toutes les bibliothèques requises disponibles ni privilèges su.

Ma question est, dois-je construire mon application en reliant dynamiquement ou statiquement à toutes ces bibliothèques?

Notes:

(1) Je suis conscient de la liaison statique peut être une douleur au cours du développement (compilation plus temps, la compilation croisée pour les 32 et 64 bits, en descendant des chaînes de dépendance pour inclure toutes les bibliothèques, etc.), mais il est beaucoup plus facile lors des essais -. il suffit de déplacer le fichier et lancez

(2) D'autre part, les coutures de liaison dynamique plus facile pendant la phase de développement - court temps de compilation, (je ne sais pas vraiment comment gérer la liaison dynamique à 64 bibliothèques de bits de mon environnement dev 32 bits), sans agitation avec dépendance Chaînes. Le déploiement de nouvelles versions d'autre part peut être laid -. En particulier lorsque de nouvelles bibliothèques sont nécessaires (voir conditions ci-dessus de ne pas avoir su les droits sur les machines ciblées, ni ces bibliothèques disponibles)

(3) J'ai lu des questions connexes concernant ce sujet, mais ne pouvait pas vraiment savoir quelle approche convient le mieux à mon scénario.

Conclusions:

  1. Merci à tous pour vos commentaires!
  2. Je vais probablement la liaison statique parce que:
    • Déploiement facile
    • la performance et des résultats plus Prévisible cohérents pendant perf. les tests (voir cet article: http://www.inf.usi.ch/faculty/hauswirth/publications/CU-CS-1042-08.pdf)
    • Comme l'a souligné, la taille et la durée de la compilation de l'électricité statique par rapport dynamique ne semble pas être une énorme différence
    • cycles de test plus facile et plus rapide
    • Je peux garder tout le même dev. le cycle sur mon dev. la machine
Était-ce utile?

La solution

liaison statique a une mauvaise réputation. Nous avons d'énormes disques durs ces jours-ci, et des tuyaux extrêmement gras. La plupart des anciens arguments en faveur de liens dynamiques sont beaucoup moins importants maintenant.

De plus, il y a une très bonne raison de préférer la liaison statique sur Linux. La pléthore de configurations de plates-formes là-bas, il est quasiment impossible de garantir votre exécutable fonctionnera à travers même une petite fraction d'entre eux sans liaison statique

Je soupçonne que ce ne sera pas une opinion populaire. Bien. Mais j'ai 11 ans d'expérience sur le déploiement d'applications Linux, et jusqu'à ce que quelque chose comme vraiment hors bit de poids faible et prend Prolonge vraiment il est atteint, Linux continuera d'être beaucoup plus difficile de déployer des applications sur. Jusque-là, le lien statiquement votre application, si vous devez courir à travers une large gamme de plates-formes.

Autres conseils

Je probablement utiliser la liaison dynamique au cours (la plupart) le développement, puis passer à la liaison statique pour les phases finales du développement et de (tous) le déploiement. Heureusement, il y a peu de besoin de tests supplémentaires lors du passage de dynamique à liaison statique des bibliothèques.

Ceci est un autre vote pour la liaison statique. Je ne l'ai pas remarqué beaucoup plus les temps de liaison pour des applications. L'application en question est une application console de ligne ~ 50K, avec plusieurs bibliothèques qui est compilé pour un groupe de hors des machines ordinaires, la plupart du temps avec des super-ordinateurs 100-10,000 noyaux. Avec la liaison statique, vous savez exactement ce que vous allez les bibliothèques à l'aide, peut facilement tester les nouvelles versions d'entre eux.

En général, cela est la manière que la plupart des applications Mac sont construites. Il est ce qui permet une installation à copier simplement un répertoire sur le système.

Le mieux est de laisser cela à l'emballeur et de fournir les deux options du configure / make scripts. Habituellement, la liaison dynamique aurait la préférence depuis lors, il serait facile de mettre à niveau les bibliothèques lorsque cela est nécessaire, à savoir lorsque des failles de sécurité, etc. sont découverts.

Notez que si vous ne disposez pas des privilèges root pour installer les bibliothèques dans les répertoires du système, vous pouvez compiler le programme tel qu'il va d'abord chercher ailleurs pour toutes les bibliothèques dynamiques nécessaires, cela est accompli en fixant la directive RUNPATH dans les exécutables ELF. Vous pouvez spécifier un répertoire avec l'option -rpath de l'éditeur de liens ld.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top