2012-12-02 2 views
10

Wahrscheinlich eine einfache Antwort; Ich bin ziemlich verwirrt mit der Sprache, die in der GCC-Dokumentation für einige dieser Flaggen verwendet wird!Wann bestimmte Optimierungen wie -fwhole-program und -fprofile-generate mit mehreren gemeinsam genutzten Bibliotheken zu verwenden sind

Wie auch immer, ich habe drei Bibliotheken und ein Programm, das alle diese drei verwendet. Ich kompiliere jede meiner Bibliotheken separat mit individuellen (möglicherweise) verschiedenen Gruppen von Warnflags. Allerdings kompiliere ich alle drei Bibliotheken mit dem gleichen Satz von Optimierungsflags.

Ich kompiliere dann meine Hauptprogrammverknüpfung in diesen drei Bibliotheken mit einem eigenen Satz von Warnflags und den gleichen Optimierungsflags, die während der Kompilierung der Bibliotheken verwendet wurden.

1) Muss ich die Bibliotheken mit vorhandenen Optimierungs-Flags kompilieren oder kann ich diese Flags nur beim Kompilieren des endgültigen Programms und Verknüpfen mit den Bibliotheken verwenden? Wenn letzteres, wird es dann alle oder nur einige (vermutlich das was genannt wird) des Codes in diesen Bibliotheken optimieren?

2) Ich möchte -fwhole-Programm -flto-fuse-linker-plugin und das Linker-Plugin Gold verwenden. In welchem ​​Stadium kompiliere ich mit diesen auf ... nur die finale Kompilierung oder müssen diese Flags während der Kompilierung der Bibliotheken vorhanden sein?

3) So ziemlich wie 2) jedoch mit, -fprofile-erzeugen -fprofile-arcs und -fprofile-use. Ich verstehe, dass man zuerst ein Programm mit generate und dann mit use ausführt. Muss ich jedoch jede der Bibliotheken mit generate/use etc. oder nur dem finalen Programm kompilieren? Und wenn es nur das letzte Programm ist, wenn ich dann mit -fprofile-use kompiliere, wird es auch die Bibliotheken-Funktionalität optimieren?

Antwort

1

ich dann meine Hauptprogrammverknüpfung in diesen drei Bibliotheken mit seinen eigenen Satz von Warnflaggen und den gleichen Optimierungsflags bei der Erstellung der Bibliotheken verwendet kompilieren.

Hier sind zwei Schritte, nicht einer. Das Kompilieren des Hauptprogramms, um eine Objektdatei zu erzeugen, ist das erste und das anschließende Verknüpfen von allem zusammen, um eine ausführbare Binärdatei zu erzeugen, ist der zweite Schritt.

1) Muss ich die Bibliotheken mit Optimierungs-Flags kompilieren vorhanden oder kann ich diese Flags verwenden nur, wenn das endgültige Programm zusammenzustellen und um zu den Bibliotheken verknüpfen? Wenn letzteres, wird es dann alle oder nur einige (vermutlich das was genannt wird) des Codes in diesen Bibliotheken optimieren?

Optimierungsflags und andere Flags auf Compilerebene müssen pro Quellcodedatei angegeben werden. Jedes Mal, wenn eine Quelldatei kompiliert wird, um eine Objektdatei zu erstellen, müssen Sie die Flags angeben. Die Erstellung einer Bibliothek oder einer ausführbaren Datei erfolgt dann durch den Linker unter Verwendung eines anderen Satzes von Flags für den Linker.

2) Ich möchte -fwhole-Programm -flto -fuse-Linker-Plugin und der Linker-Plugin Gold verwenden. In welchem ​​Stadium kompiliere ich mit diesen am ... gerade die finale Übersetzung oder müssen diese Flags während die Zusammenstellung der Bibliotheken vorhanden sein?

Sie müssen -flto angeben, wenn Sie jede Quellcodedatei kompilieren (oder die, die Ihnen zur Verfügung stehen).Sie müssen -fuse-linker-plugin und -fwhole-program nicht angeben, wenn Sie den Goldlinker oder GNU ld 2.21 oder neuer verwenden. Weitere Informationen finden Sie unter documentation unter -flto.

3) so ziemlich das gleiche wie 2) jedoch mit, -fprofile generieren -fprofile-Bögen und -fprofile-use. Ich verstehe, dass man zuerst ein Programm mit generate und dann mit use ausführt. Muss ich jedoch kompilieren jede der Bibliotheken mit generieren/verwenden etc. oder nur das letzte Programm? Und wenn es nur das letzte Programm ist, wenn ich dann mit -fprofile-use kompiliere, wird es auch die Bibliotheken-Funktionalität optimieren?

Wie 2. Diese Flags müssen pro Quellcodedatei angegeben werden, damit der gesamte Code optimiert wird.

Bitte beachte, dass, falls Sie nicht den Quellcode haben, können Sie immer noch verknüpfen statische oder dynamische Bibliotheken, die nicht mit den gleichen Fahnen wurden optimiert und der Code funktioniert. Das heißt, Sie können Code mischen, der auf verschiedenen Ebenen optimiert ist.

+1

Zusätzlich zu, dass - dass -flto beachten Sie mit den Shared Libraries nicht in Wechselwirkung treten, die Sie Sie verknüpfen könnte Link Zeitoptimierung durchführen, wenn die gemeinsam genutzte Bibliothek Gebäude selbst, so dass es von flto zugute kommt, wenn es gebaut wird, aber Ihre eigene ausführbare Links zu dieser gemeinsam genutzten Bibliothek können keine Optimierung der Verbindungszeit zwischen der ausführbaren Datei und den gemeinsam genutzten Bibliotheken, mit denen sie verknüpft ist, durchführen. (Aber Sie können mit statischen Bibliotheken) – nos

Verwandte Themen