Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Funktion vom Linker entfernt.. (https://www.delphipraxis.net/74313-funktion-vom-linker-entfernt.html)

Angel4585 1. Aug 2006 10:30


Funktion vom Linker entfernt..
 
Hallo,

kann mir wer sagen warum diese Funktion vom Linker entfernt wurde?
Ich bekomm das wenn ich im Debugmodus mit der Maus über die Property geh die diese Funktion als read-Funktion hat.

Delphi-Quellcode:
function TdmTabellen.GetComboBoxWert: Integer;
begin
Result:=-1;
if Assigned(FComboBox)then
  Result:=FComboBox.ItemIndex;
end;
Irgendwie kapier ich nich was der da von mir sonst noch will... :gruebel:

MfG :angel:

himitsu 1. Aug 2006 11:05

Re: Funktion vom Linker entfernt..
 
Weil du sie nirgendwo verwendet hast?

Angel4585 1. Aug 2006 11:55

Re: Funktion vom Linker entfernt..
 
gott bin ich blöd :wall:

berens 9. Nov 2006 12:05

Re: Funktion vom Linker entfernt..
 
Kann man das generell ausstellen?

Ich habe hier:
Delphi-Quellcode:
var
  t: string;
  dt: TDateTime;
begin
  dt := 12345;
  t := FormatDateTime('c', dt); // x
end;
Funktioniert zwar als Quelltext, wenn ich "FormatDateTime('c', dt)" aber bei Überwachte Ausdrücke reinschreibe erscheint auch vor/nach der mit x markierten Zeile die Fehlermeldung (als Ergebnis in dieser Zeile bei Überwachte Ausdrücke): Die aufzurufende Funktion FormatDateTime wurde vom Linker entfernt. Wie kann man das verhindern / korrigieren? Ich bin nicht so toll im Kopfrechnen dass ich immer automatisch weiß, wie das menschenlesbare Datum eines TDateTime-Wertes ist...

Christian Seehase 9. Nov 2006 12:11

Re: Funktion vom Linker entfernt..
 
Moin Berens,

mach' doch irgendetwas mit dem t, z.B., über OutputDebugString wegschreiben.

Muetze1 9. Nov 2006 12:11

Re: Funktion vom Linker entfernt..
 
Einfach die Optimierung in den Compiler-Optionen des Projektes ausstellen und Projekt komplett neu erstellen.

berens 9. Nov 2006 12:19

Re: Funktion vom Linker entfernt..
 
Muetze1: Ich habe nun bei den Compiler-Optionen die Code-Optimierung deaktiviert und zusätzlich die betroffene Unit mit {$O-}
gekennzeichnet. Das Ergebnis bleibt das gleiche.

Christian Seehase: OutputDebugString bringt ja afaik nur was, wenn ich an einer Stelle schon genau weiß, in welcher Form ich welche Variable auslesen muss. Da bei einem Fehler das Problem ja über den gesamten Quelltext verteilt sein kann, ist das so leider nicht praktikabel. Ich gehe im Moment ja schon den Umweg über das Zwischenspeichern des Datums in t als String und lese diesen dann aus, aber dann auf einmal brauche ich zum Vergleich wieder ein anderes Datum, und das System ins hinne... So geht das also leider nicht :(

Noch andere Ideen?

Muetze1 9. Nov 2006 12:22

Re: Funktion vom Linker entfernt..
 
Zitat:

Zitat von berens
Muetze1: Ich habe nun bei den Compiler-Optionen die Code-Optimierung deaktiviert und zusätzlich die betroffene Unit mit {$O-} gekennzeichnet. Das Ergebnis bleibt das gleiche.

Zitat:

Zitat von Muetze1
Einfach die Optimierung in den Compiler-Optionen des Projektes ausstellen und Projekt komplett neu erstellen.

Auch beachtet?

berens 9. Nov 2006 12:27

Re: Funktion vom Linker entfernt..
 
Was meinst du mit komplett neu erstellen?

Ich habe

-Projekt
--> frmMain erzeugen
--> Alle Projekte erstellen
--> Alle Projekte compilieren

durchgeführt. Muss ich noch etwas beachten?

Flocke 9. Nov 2006 12:29

Re: Funktion vom Linker entfernt..
 
Der optimierende Linker ist AFAIK keine Option sondern immer eingeschaltet.

Der schöne Günther 25. Feb 2014 13:17

AW: Funktion vom Linker entfernt..
 
Generationen später.

Ich habe immer noch das gleiche Problem. Gibt es generell ein "Linker, entferne nichts ungenutztes!", das man irgendwo einbauen kann?

Mit Gewalt irgendwo gezwungene Aufrufe für irgendwas einzubauen (meinetwegen umgeben von einem "IFDEF DEBUG"-Block) ist ja irgendwie keine schöne Lösung.

himitsu 25. Feb 2014 14:22

AW: Funktion vom Linker entfernt..
 
Aktuell wird nichts mehr entfernt.
es ist eher so, daß man jetzt (mindestens seit XE3) dem Compiler explizit sagen muß, daß er ungenutzte Methoden weglassen soll.
(vorallem bei Published-Methoden, aber ich weiß jetzt nicht, ob das auch alle anderen Methoden betrifft)

Drum werden die EXEn auch immer größer. (und wegen der RTTI)

Delphi geht quasi davon aus, daß man die Funktionen dennoch nutzen und z.B. indirekt via RTTI aufrufen könnte, selbst wenn sie nirgendwo explizit aufgerufen wird.




Aber wozu soll denn ungenutztes Zeug mit in die EXE gelinkt werden, wen du es eh nicht verwendest?

Der schöne Günther 26. Feb 2014 09:44

AW: Funktion vom Linker entfernt..
 
Ganz konkretes Beispiel: Wenn ich im Debugger in meiner DEBUG-Fassung eine Interface-Referenz nehmen möchte und sie auf eine Klassen-Referenz casten möchte. Dann kann ich das nicht, denn "SafeIntfAsClass wurde vom Linker entfernt".

Nun muss ich in der Debug-Fassung meines Projekts einmal künstlich so einen Cast einbauen damit der Linker es nicht entfernt. Mit der Zeit treffe ich immer wieder auf andere Aufrufe die beim Debuggen nützlich sind, aber entfernt wurden.

Daher meine Frage: Kann ich nicht irgendwo an (bislang nicht gefundenen Linker-Optionen) einstellen, dass er bitte einfach alles aus den inkludierten Units mitnimmt und nichts entfernt?

himitsu 26. Feb 2014 10:55

AW: Funktion vom Linker entfernt..
 
Diese Methoden einfach mal published zu machen hilft nicht?

Der schöne Günther 26. Feb 2014 11:34

AW: Funktion vom Linker entfernt..
 
Liste der Anhänge anzeigen (Anzahl: 3)
Ich erkläre es mal andersherum.


Gegeben sei folgendes:
Delphi-Quellcode:
   IMyInterface = interface
      //
   end;

   TMyClass2 = class(TInterfacedObject, IMyInterface)
      protected var
         someInternalStuff: Single;
   end;
Bild 1: Ich habe eine
Delphi-Quellcode:
IMyInterface
-Variable. Der Compiler sagt mir direkt, dass sich dahinter eine
Delphi-Quellcode:
TMyClass2
-Instanz verbirgt. Soweit alles super. :thumb:

Bild 2: Jetzt möchte ich die Variable auf
Delphi-Quellcode:
TMyClass2
casten um zu sehen, was denn
Delphi-Quellcode:
someInternalStuff
für einen Wert hat. Da ich so etwas im Quelltext nie gemacht habe, hat der Linker das entfernt.

Bild 3: Die Lösung: Um das zu umgehen muss ich halt im Quelltext einfach mal ein Interface zu einem Objekt casten. Dann geht es.


Was ich suche: Eine Alternative dazu. Der Fall "Interface zu Objekt" ist ja nur ein Beispiel. Ich würde gerne vermeiden, immer Aufrufe zu sammeln, die ich in der Debug-Fassung einmal künstlich aufrufen muss. Gibt es da einen Weg?


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz