Frage

Ich bin gehen zu beginnen ein neues C++ - Projekt, das sich auf eine Reihe von Bibliotheken, darunter ein Teil der Boost-Bibliotheken, die log4cxx oder die google-logging-Bibliothek - und wie sich das Projekt entwickelt andere als gut (das kann ich noch nicht erkennen).

Es wird auf 32-und 64-bit Systeme, sehr wahrscheinlich in einem Recht unterschiedlichen Linux-Umfeld, wo ich nicht erwarten, dass alle erforderlichen Bibliotheken verfügbar sind, noch su-Rechte.

Meine Frage ist, sollte ich Baue meine Anwendung entweder dynamisch oder statisch verknüpfen, um all diese Bibliotheken?

Hinweise:

(1) ich bin mir bewusst, die das statische verknüpfen könnte ein Schmerz während der Entwicklung (mehr kompilieren Zeiten, cross-kompilieren für 32-und 64-bit, going down Abhängigkeit Ketten alle Bibliotheken usw.), aber es ist viel einfacher, während des Tests - nur bewegen Sie die Datei und starten Sie.

(2) Auf der anderen Seite, die dynamische Verknüpfung Nähte einfacher, die während der Entwicklungsphase - kurze kompilierzeiten (nicht wirklich wissen, wie zu behandeln die dynamische Verknüpfung zu 64-bit-Bibliotheken von meinem 32 bit dev-Umgebung), keine Hektik, mit dependency chains.Die Bereitstellung von neuen Versionen auf der anderen Seite kann hässlich sein - vor allem, wenn neue Bibliotheken benötigt (siehe die oben genannten Bedingungen nicht mit su-rechten auf der Maschinen gezielt, noch diese Bibliotheken verfügbar).

(3) ich habe gelesen, die Fragen zu diesem Thema, konnte aber nicht wirklich herausfinden, welcher Ansatz am besten zu Ihnen passt mein Szenario.

Schlussfolgerungen:

  1. Ich danke Ihnen allen für Ihre Eingabe!
  2. Ich werde wahrscheinlich gehen mit statischen Verknüpfung, weil:
    • Einfacher Bereitstellung
    • Vorhersagbare Leistung und mehr konsistente Ergebnisse während perf.Prüfung (Blick auf das Papier:http://www.inf.usi.ch/faculty/hauswirth/publications/CU-CS-1042-08.pdf)
    • Wie wies darauf hin, die Größe und Dauer der Zusammenstellung der statische vs.dynamische scheint nicht so ein großer Unterschied
    • Einfacher und schneller test-Zyklen
    • Ich kann halten alle die dev.Zyklus auf meiner dev.Maschine
War es hilfreich?

Lösung

Statische Verknüpfung hat einen schlechten Ruf. Wir haben große Festplatten in diesen Tagen, und außerordentlich fetten Rohren. Viele der alten Argumente, die für eine dynamische Verbindung sind viel weniger wichtig jetzt.

Außerdem gibt es einen wirklich guten Grund statische Linken auf Linux zu bevorzugen. Die Fülle von Plattformkonfigurationen gibt es fast unmöglich machen, zu gewährleisten, die ausführbare Datei Willen Arbeit über noch einen kleinen Bruchteil von ihnen ohne statische Linken

Ich vermute, dass dies nicht eine populäre Meinung sein. Fein. Aber ich habe 11 Jahre Erfahrung Anwendungen auf Linux-Bereitstellung und bis so etwas wie LSB wirklich auszieht und wirklich reiche es Reichweite, wird Linux weiterhin viel schwieriger sein, Bereitstellung von Anwendungen auf. Bis dahin verknüpft statisch Ihre Anwendung, wenn Sie über eine Vielzahl von Plattformen laufen haben.

Andere Tipps

würde ich wahrscheinlich dynamische Verknüpfung verwendet während der (meisten) Entwicklung und dann über zu statisch für die letzten Phasen der Entwicklung und (alle) Bereitstellung Verknüpfung ändern. Glücklicherweise gibt es wenig Bedarf für zusätzliche Tests, wenn sie von dynamischer zu statischer Verknüpfung der Bibliotheken wechseln.

Dies ist ein weiteres Votum für die statische Verbindung.Ich habe nicht bemerkt, deutlich mehr verknüpfen Zeiten für die out-Anwendung.Die app in Frage, ist eine ~50K line console app, mit mehrere Bibliotheken kompiliert wird für eine Reihe von aus der gewöhnlichen Maschinen, meist Supercomputer mit 100-10,000 Kernen.Mit statischen Verknüpfung, wissen Sie genau, was Bibliotheken, die Sie benutzen werden, können leicht testen neue Versionen von Ihnen.

Im Allgemeinen, dies ist die Art und Weise, die die meisten Mac-apps, die gebaut werden.Das ist es, was die installation einfach kopieren eines Verzeichnisses auf dem system.

Am besten ist es, dass zu den Verpacker zu verlassen und beiden Optionen in den Skripten configure / make bieten. Normalerweise dynamische Verknüpfung würde den Vorzug hat, da dann wäre es leicht, die Bibliotheken zu aktualisieren, wenn nötig, das heißt, wenn Sicherheitslücken usw. entdeckt werden.

Beachten Sie, dass, wenn Sie keine Root-Rechte verfügen, um die Bibliotheken in den Systemverzeichnissen installieren Sie das Programm zusammenstellen können, so dass sie zunächst an anderer Stelle für alle benötigten dynamischen Bibliotheken aussehen wird, wird dies durch die RUNPATH Richtlinie in ELF-Binärdateien zu setzen. Sie können ein solches Verzeichnis mit dem -rpath Option des Linkers ld angeben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top