Ich dachte, dass private
-Methoden, die nicht innerhalb ihrer Klasse verwendet werden, vom Compiler / Linker entfernt werden und nicht Teil der endgültigen Binärdatei sind.
Ich habe eine Beispielklasse mit einer privaten Methode erstellt, die implementiert aber nicht verwendet wird.
%Vor%Und in der Implementierungsdatei:
%Vor%Nach der Kompilierung existiert der String noch in der endgültigen Binärdatei. Warum? Und wie kann ich das verhindern?
Mit freundlichen Grüßen, Charly
Eine Möglichkeit besteht darin, für jede Funktion eine .o-Datei zu haben. Erstellen Sie dann ein Archiv .a aus diesen .o-Dateien. Bei der Verknüpfung mit diesem Archiv verknüpft der Linker nur die .o-Dateien, die Symbole auflösen, d. H. Die .o-Dateien mit einer Funktion, die niemand aufruft, sind nicht verknüpft.
Eine andere Möglichkeit besteht darin, die neuesten Versionen von gcc mit Link-Time-Code-Generierung .
Nach der Kompilierung existiert der String noch in der endgültigen Binärdatei. Warum
Andere haben Vorschläge gemacht, wie Sie diesen unbenutzten Code in Ihrer endgültigen Binärdatei loswerden können. Ich möchte eine Antwort auf die Why
geben ein bisschen - hier sind zwei Punkte, warum es unmöglich sein könnte, die Funktion zu entfernen.
Wenn Sie nicht alle Objekte dieses Typs XXX
mit statischer Verknüpfung deklariert haben, kann der Compiler den Typ nicht entfernen ( und daher die Methode) aus der generierten Objektdatei, da einige andere Objektdateien möglicherweise auf den Wert mit extern
zugreifen. Der Linker, der alle Objektdateien gleichzeitig sehen kann, könnte dies möglicherweise lösen.
Da Sie Ihre Frage jedoch als gcc
getaggt haben, kann es sein, dass Sie nicht kompilieren und / oder mit verlinken - fvisibility = versteckt . In diesem Fall kann selbst der Linker das Symbol (und damit den Code) nicht entfernen, da andere Module das Symbol zur Laufzeit auflösen können.