Starke Linktypen (Delphi)

Aus RAD Studio
Wechseln zu: Navigation, Suche

Nach oben zu Liste der Delphi-Compiler-Direktiven - Index

Typ

Option

Syntax

{$STRONGLINKTYPES ON} oder {$STRONGLINKTYPES OFF}

Vorgabe

{$STRONGLINKTYPES OFF}

Bereich

Global



Anmerkungen

Diese Direktive steuert, wie die endgültige EXE oder DLL gelinkt wird. Um ein verlässliches Ergebnis zu erzielen, sollte sich die Direktive im Hauptprogramm oder im Bibliotheksquelltext (.dpr) befinden. Sie wirkt sich nur auf Programme (EXEs) und Bibliotheken (DLLs), nicht auf Packages (BPLs) aus.

{$STRONGLINKTYPES ON} linkt mit starken Bereinigungen (im Gegensatz zu schwachen Bereinigungen) alle Typen in der Stammtyptabelle der EXE oder DLL. Die Stammtyptabelle ist der Index, mit dem die Unit RTTI qualifizierte Namen zu Typen zuordnet. Der intelligente Linker entfernt Symbole (einschließlich der den Typen zugeordneten RTTI), die nur von schwachen Bereinigungen referenziert werden. Wenn ein oder mehrere starke Bereinigungen das Symbol referenzieren, dann wird es in die endgültige Binärdatei aufgenommen, und die schwachen Referenzen werden nicht auf @PointerToNil gesetzt.

Zum Beispiel:

uses Rtti;
var
   c: TRttiContext;
begin
   Writeln(Length(c.GetTypes));
end.

(Ausgabe: 344)

Dieses Programm gibt die Anzahl der verfügbaren (d.h. in die ausführbare Datei eingebundenen) public-Typen aus. Public-Typen haben einen QualifiedName, nach public-Typen kann mit System.Rtti.TRttiContext.FindType über den Namen gesucht werden und IsPublicType gibt für public-Typen True zurück. Die Anzahl der verfügbaren Typen hängt normalerweise davon ab, wie der Code solche Typen referenziert. Der intelligente Linker versucht nämlich, RTTI-Informationen zu entfernen, die nicht direkt vom Quellcode des Programms verwendeten Typen zugeordnet sind.

Der Linker kann aber keine indirekten Referenzen auf Typen ermitteln, z.B. durch die Verwendung von System.Rtti.TRttiContext.FindType zum Nachschlagen eines Typs anhand des Namens.

In fortgeschrittenen Szenarien können Typen nie direkt referenziert werden, sondern nur per Name gesucht werden -- wie bei der Deserialisierung. In diesen Situationen wäre es wünschenswert, auf alle Typen zugreifen zu können, ohne im Quellcode manuell auf sie verweisen zu müssen, und sie so einzubinden. {$STRONGLINKTYPES ON} hat diesen Effekt:

uses Rtti;
{$STRONGLINKTYPES ON}
var
   c: TRttiContext;
   t: TRttiType;
begin
   Writeln(Length(c.GetTypes));
end.

(Ausgabe: 2203)

Weil diese Direktive den intelligenten Linker weitgehend aufhebt, kann die Größe der ausführbaren Datei erheblich zunehmen, da mehr RTTI-Informationen in die ausführbare Datei aufgenommen werden, einschließlich Code von Methoden, die die RTTI referenziert und Code, der von diesen Methoden referenziert wird usw.