2016-01-05 11 views
5

Es gibt statische Bibliotheken und dann gibt es gemeinsam genutzte Bibliotheken. Wäre es nicht möglich, nur die gemeinsamen zu haben und sie bei Bedarf statisch zu verknüpfen?Warum haben wir zwei Arten von Bibliotheken in C/C++?

Kompilieren einmal mit -fPIC und einmal ohne scheint wie eine Verschwendung. Ich weiß nicht viel Assembly, aber sollte es nicht möglich sein, relozierbaren Code in statischen Code um Größenordnungen schneller zu transformieren, als alles neu zu kompilieren?

+0

Diese Antwort erwähnt, dass es ratsam ist zweimal zu kompilieren den PIC-Overhead für statische Bibliotheken zu vermeiden: http://stackoverflow.com/questions/4863791/creating-both-static-and-shared-c-libraries – PSkocik

+2

Bibliothek Aromen sind ein Attribut des Binärformats, das vom Betriebssystem unterstützt wird. Weder C noch C++ wissen etwas über sie und auch nicht über die Bibliotheken selbst. –

+0

Es gibt keine Sprache C/C++. Und die Frage ist nicht spezifisch für einen PL. – Olaf

Antwort

6

Dies ist teilweise ein historisches Problem. Früher gab es nur statische Bibliotheken. Sie wurden statisch mit jeder vom System kompilierten Binärdatei verknüpft. Dies stellte jedoch unter anderem einen Wartungs-Albtraum dar, der erforderte, dass alle verwendenden Pakete neu kompiliert wurden, wenn eine Bibliothek gepatcht oder geändert wurde.

Dann kam gemeinsame Bibliotheken zur Behebung dieser Probleme. Nun zu Ihrer Frage: Erstens gibt es einige signifikante Optimierungen, die in einer statisch verknüpften Bibliothek stattfinden können, die bei dynamischen nicht möglich ist. Selbst wenn man dynamische Bibliotheken in statische Bibliotheken umwandeln würde, wäre es wahrscheinlich weniger effizient als Code statisch zuerst kompiliert.

Zweitens verwenden die meisten modernen Systeme sowieso nur gemeinsam genutzte Bibliotheken, so dass es kein großes Problem gibt, Dinge werden nur einmal als gemeinsame Bibliothek kompiliert.

Als eine leichte beiseite, aber immer noch relevant, könnten Sie in prelinking suchen. Ein Schritt, der einen Teil des Start-Up-Overhead wegnimmt (obwohl er nicht immer die gleiche Leistung wie eine statische Verbindung erzielt) und Software, die dynamisch in Bibliotheken verknüpft ist, schneller starten lässt.

+0

Danke. Ich verwende Prelink auf meinem Linux. Ich bin gespannt, ob es möglich ist, eine statische Bibliothek statisch zu verknüpfen. Ich denke zumindest theoretisch sollte es sein, da PIC-Objektdateien sich gut verlinken lassen. – PSkocik

+1

"Dann kamen gemeinsam genutzte Bibliotheken zur Lösung dieser Probleme." ... und hunderte weitere erstellen ... –

+0

@PSkocik Ja, es ist möglich, http://stattifier.sourceforge.net/ und http://magicermine.com/ dies zu tun, aber Vorsicht, die Binärdateien, die sie generieren, sind sehr, sehr groß, wesentlich langsamer als dynamische oder normale statische und oft flockig oder unzuverlässig – Vality

1

Obwohl theoretisch dynamische Bibliotheken in statische nachbearbeiten könnte, wäre die Schwierigkeit einer solchen Aufgabe - vor allem, es gut zu machen - mit dem Kompilieren von Grund auf vergleichbar. Es ist wahrscheinlich schwieriger, das gleiche Ergebnis durch Nachbearbeitung wie durch eine statische Erstellung von Grund auf neu zu erstellen, anstatt einfach wieder zu erstellen, und jedes Tool, das dafür benötigt wird, würde seine eigene Wartungslast tragen. Warum sollten Sie das tun, wenn es bereits einen vollkommen guten Weg gibt, dasselbe Ziel zu erreichen?

Darüber hinaus ist das Erstellen von statischen und gemeinsamen Bibliotheken keineswegs erforderlich. Selbst dort, wo Sie das tun wollen, sind die zusätzlichen Kosten ein relativ kleiner Teil der gesamten Entwicklungszeit.

0

Sie würden statische Bibliotheken verwenden, wenn Ihre ausführbare Datei nicht von einer Bibliothek abhängig sein soll. Grundsätzlich wird die Bibliothek innerhalb der ausführbaren Datei "versandt".

Natürlich ist dies sehr situationsbedingt wie die meisten Zeiten gemeinsame Bibliotheken sind der Weg zu gehen.

Verwandte Themen