g ++ Teilvernetzung statt Archiven?
Frage
Ich bin ziemlich neu in der C ++ Fluss zu bauen, und ich denke an Schaltteilvernetzung für meine Bibliotheken zu verwenden, anstatt ar
Archive zu schaffen. Ich hoffe Link Zeit in einer unvermeidlichen letzten Kompilierschritt zu reduzieren, die ich habe, und ich meint, Teil einmal einige Bibliotheken verbinden mir Zeit sparen könnte alles in diesem letzten Schritt über die Verknüpfung.
Ist das, was ich beschreibe möglich? Ich meine, es sollte etwas entlang der Linien ld -Ur -o mylib.o [components]
sein. Gibt es wichtige Build Überlegungen, die ich nicht berücksichtigt?
Lösung
Sie verlieren einen wichtigen Effekt die Objektdateien in einem ar
Archiv zu haben, die das nur die referenzierten Objekte in verknüpft werden.
Wenn Sie sowohl foo.o
mit dem Symbol foo
und bar.o mit dem Symbol bar
in einem ar
Archiv haben, und nur das foo
Symbol verweisen, nur foo.o
würde verknüpft werden. Wenn Sie stattdessen einen Teil Link tun, deren Inhalt beide werden in der ausführbaren Datei am Ende, auch wenn bar
nie irgendwo verwiesen wird.
Sie können auch versuchen, eine schnellere Linker, wie Gold .
Andere Tipps
Die andere Zeit, die Sie ld -r zu tun, um einen Teil-Link verwenden möchten, wenn Sie einige Objektdateien, die statische Initialisierung enthält, die bestimmten Funktionen bereitzustellen sind erforderlich, aber das wird nie direkt von einem Code aufgerufen.
Wenn Sie ich möchte ein Dokument aufzuschreiben, die zeigt, wie das funktioniert und warum es funktioniert!
(siehe Laufzeit C ++ Klasse Registrierung zum Beispiel, verwendet es eine statische Registerfunktion, die in einem Register registriert sich, die dann verwendet werden kann, zu schaffen und eine Basis * mit polymorphen Verhalten zurückkehren, da es ein neues Objekt erstellt, die vererbt wurde Siehe von Base. C ++ Runtime-Kenntnisse der Klassen die ist eine Antwort auf eine Frage, die ich gefragt.)