2013-02-13 13 views
6

Der einzige Vorteil, den ich mir vorstellen kann, ist die Übersetzungsgeschwindigkeit. Das Endergebnis (binäre Größe und Geschwindigkeit) sollte in beiden Fällen gleich sein (es sei denn, die statische Bibliothek wurde natürlich ohne Optimierungen kompiliert).Welche Vorteile bietet die Verwendung der vorkompilierten statischen Bibliothek direkt einschließlich des Quellcodes?

Auch würden einige Referenzen geschätzt.

Update: Diese Frage tauchte auf, als wir kleine Open-Source-Bibliotheken von Drittanbietern in unser Projekt einbeziehen mussten. Ein Entwickler gab eine Erklärung ab, dass die Einbeziehung der vorkompilierten statischen Bibliothek (anstatt nur Quelldateien zu kopieren) die Leistung der App erhöhen würde. Ich sehe keinen Grund, warum dies der Fall sein sollte.

Die Frage ist also: würde die Aufnahme von vorkompilierte Bibliothek wirklich Leistung der endgültigen App verbessern?

Antwort

3

Wenn Sie über eine Drittanbieter-Bibliothek sprechen, sind einige Vorteile für sie: keine Notwendigkeit, Quellcode, (möglicherweise) einfachere Installation für End-Entwickler zu veröffentlichen ... obwohl manchmal stellt sich heraus mehr von ein Ärger, vor allem, wenn es nicht richtig gemacht wurde (Verknüpfung in anderen Open-Source-Projekten, ohne Symbole zu fixieren, falsche Architekturen werden unterstützt).

Wenn Sie nur Ihren eigenen Code bedeuten - scheint wie du bist nur Kopfschmerzen für sich selbst zu schaffen. Wenn die Dateien nicht ändern, dann werden sie bereits auf der Festplatte erstellt werden (.o) und der Compiler wird sie nicht wieder aufbauen müssen, wenn Sie ein sauberes tun/alle wieder aufzubauen. Sie werden also wahrscheinlich keine Übersetzungsgeschwindigkeit erhalten.

So oder so - ja, sollte die Ausgabe gleich sein. Eine statisch verknüpfte Bibliothek ist nur eine Sammlung derselben .o-Dateien, mit denen Sie direkt verlinkt hätten.

EDIT:

Insbesondere Adressiergeschwindigkeit von .o vs .a - .a ist einfach eine Sammlung von .o-Dateien für eine einfache Verpackung während der Entwicklung. Nach der Verknüpfung ist das Ergebnis identisch. Ich habe gerade eine schnelle geistige Gesundheit Test, um zu überprüfen:

$ cat a.c 
#include <stdio.h> 

extern char *something(); 

int main() 
{ 
    printf("%s", something()); 
    return 0; 
} 
$ cat b.c 
char *something() 
{ 
    return "something fancy here\n";  
} 

$ gcc -c -o a.o a.c 
$ gcc -c -o b.o b.c 
$ gcc -o foo1 a.o b.o 
$ ar -r b.a b.o 
ar: creating archive b.a 
$ gcc -o foo2 a.o b.a 
$ cmp foo1 foo2 

Und dort haben Sie es, identische Binärdateien durch die Verknüpfung von .o vs .a.

Es gibt eine leichte Leistung Hit, wenn Sie dynamische Bibliotheken anstelle von statischen Bibliotheken verwenden (ich glaube nur, wenn Symbole nachgeschlagen werden). Vielleicht bezog sich der andere Entwickler darauf, dass statische Bibliotheken etwas schneller wären als dynamische Bibliotheken.

+0

Ich bin damit einverstanden, mich mit zu viel von dieser Antwort zu beantworten. Aber ich wollte nur hinzufügen, dass es wirklich darauf ankommt, wer du bist und wofür das Projekt ist. Eigene Sachen, bei denen du die Quelle besitzt und dir keine Sorgen um die gemeinsame Nutzung machen musst, dann sind statische Bibliotheken sinnlos und nur zusätzliche Arbeit für keinen Gewinn. Wenn Sie planen, zu anderen Leuten zu veröffentlichen, dann sind sie großartig, um Ihren Quellcode zu schützen. Vorkompiliert und einsatzbereit. –

+0

Ich habe die Frage aktualisiert, um den Zusammenhang besser darzustellen. Soweit ich verstehe, ist eine statische Bibliothek mehr oder weniger die rohe Ausgabe eines Compilers, so dass es bei der Verknüpfung nicht darauf ankommen sollte, ob es sich um eine statische Bibliothek oder O-Dateien handelt, die vom Compiler erzeugt wurden. – DexM

+0

aktualisierte Antwort, um Ihre aktualisierte Frage zu adressieren. – escrafford