Support Info abonnieren
per RSS Feed hier : VO Support Newsfeed
Support zu Visual Objects
Tipp des Monats für Juni 03

Ursachen für 'Link Failed!'





Druckversion anzeigen: Druckversion
Wussten Sie schon... ?
 
... dass die offensichtlichste Ursache für ein "Link failed!" gar nicht angezeigt wird?


Jeder hat schon mal beim Aufruf des Linkers (Ctrl-F8 oder ) eine "Link failed!"-Meldung ähnlich wie die folgende erhalten.

Diese enthält sogar vier Vorschläge, worin die Ursache für das Problem liegen könnte (Wir haben diese am Ende des Tipps übersetzt und kommentiert). Leider liegt die Ursache aber gar nicht so selten NICHT in einem der dort genannten Problembereiche. Und was dann?
  1. Die eigentlich trivialste Bedingung dafür, dass ein Linklauf funktionieren kann, besteht darin dass alle beteiligten Dateien erfolgreich compiliert worden sind! (Ja, wir haben bemerkt, dass bei der Herstellung des obigen Link Failed!-Screenshots ein Hinweis darauf (unmittelbar nach "Link Failed!") enthalten ist. Aber das ist leider nicht immer so.)
    • Überprüfen Sie also als Erstes (wenn keiner der im obigen Link-Failed!-Dialog dargestellten Gründe vorliegt), ob alle Bibliotheken und DLLs erfolgreich compiliert wurden. Dazu gehören nicht nur eigene Libs und DLLs, sondern auch die zu Zusatzbibliotheken gehörenden. Nach unseren Erfahrungen sind nicht compilierte Libs und DLLs der absolut häufigste Grund für ein "Link failed!" Selbst wenn der Compiled-Status OK angezeigt wird, kann es in Ausnahmefällen der Fall sein, dass dies nicht OK ist. Deshalb setzen Sie im Verdachtsfall mit "Touch" auf Anwendungsebene den Compiled-Status aller Module zurück und compilieren alles noch einmal. Kann nach erfolgreicher Compilierung immer noch nicht erfolgreich gelinkt werden, sollten Sie mal ein Repository Reindex durchführen und die oben genannten Schritte (Touch und Compile) noch einmal durchführen
    • Wie kann VOPP dabei helfen?
      VOPP enthält Hilfsprogramme, mit denen man den Inhalt eines kompletten Projekts in ein nagelneues Projekt kopieren kann und anschließend in der richtigen Reihenfolge(!) automatisch kompileren lassen kann. Das kann einem bei größeren Projekten eine längere Kaffeepause bescheren. Aber es lohnt: VOPP findet Defekte im Repository, die nicht einmal VO selbst findet. So wird auf diese Weise schon mal nicht genutzter Code entdeckt, der im alten Projekt selbst nach einem Touch All und Compile nicht hervortrat. VOPP ist übrigens in einer Lite-Version auf der VO 2.6 CD enthalten!
    • Auch Entitäten vom Typ RESOURCE können ausnahmsweise kaputt ("corrupt") sein!
      Das kann sehr schnell mal vorkommen, wenn Sie eine Window RESOURCE in den Quelltext-Editor laden und versehentlich eine Konstante in der RESOURCE ändern oder die RESOURCE sonstwie ungültig machen. Z.B. könnte auch eine Bilddatei beschädigt sein oder im hart codierten Pfad nicht mehr vorhanden sein. Der von VO aufgerufene Resource-Compiler (RC) findet diesen Fehler dann. VO bekommt in der Regel eine Mitteilung vom RC und setzt den Compiled-Status für die RESOURCE-Entität entsprechend. Wenn jedoch das Bild z.B nach der erfolgreichen Compilierung der RESOURCE verschoben wurde, bleibt der Compiled-Status auf OK! Das Problem offenbart sich, wenn die betroffene AEF in ein anderes Projekt importiert wird. Dann sollte auch für diese Entität ein roter ("non-compiled") Status angezeigt werden.
  2. Prüfen Sie, ob alle vom Linker benötigten Bibliotheken eingeschlossen sind. (siehe Application Properties/Libraries)
    Normalerweise sollte dies zu einer Meldung "Cannot Link! Dead entities in Module [name]" führen.
  3. Prüfen Sie, ob zirkuläre Referenzen vorliegen.
    Was sind zirkuläre Referenzen ?
    In der folgenden Skizze steht der Pfeil für "benötigt Funktionen/Methoden aus...": Lib A --> Lib B --> Lib C --> Lib A, d.h. in einem solchen Szenario liegen zirkuläre Referenzen vor.
    Stellen Sie sich vor, Sie haben Lib C zuerst erstellt (ohne Lib A zu verwenden!) und Lib C kann erfolgreich compiliert werden. Irgendwann erstellen Sie eine neue Lib B, die Methoden/Funktionen aus Lib C verwendet. Sollte auch kein Problem sein. Danach erstellen Sie Lib A, die Lib B (und damit implizit Lib C!) verwendet. Sie compilieren bei Änderungen zuerst Lib C, dann Lib B und dann Lib A. Auch kein Problem! Irgendwann benötigen Sie nun in Lib C Funktionen/Methoden aus Lib A. Damit ist das Desaster schon vorprogrammiert! Nur ein Beispiel von vielen möglichen Varianten: Sie ändern gleichzeitig in Lib A und in Lib B etwas und wollen dann beide Libs compilieren. Lib B kann nicht compiliert werden, da Sie eine Referenz auf Lib C enthält, die wiederum die noch nicht compilierte Lib A referenziert. Lib A kann nicht compilert werden, da Lib B derzeit nicht compiliert ist. Das nennt man einen Catch-22 oder "in die eigenen Falle gefallen". Die Tatsache, dass die zwei Libs gleichzeitig geändert wurden, macht das Problem zirkulärer Referenzen nur überdeutlich, ist daber nicht zwingend erforderlich dafür, dass man ein Link failed!-Problem wegen zirkulärer Referenzen bekommt. Entscheidend ist allein, wie Funktionen/Methoden der drei (oder mehr) Libs verflochten sind. Aufgrund unserer Erfahrungen im Supportbereich geht es mit solchen zirkulären Referenzen selten lange gut! Und je länger es gut geht, umso aufwendiger ist es meist, das Problem zu beseitigen.
  4. Führen Sie ein Repository Reindex durch!
    Ja, dieser Hinweis ist auch in den vier genannten möglichen Ursachen für das Linkproblem enthalten. Und in sehr vielen Fällen auch mit ein Grund für das Linkproblem. Nach unseren Erfahrungen kann der Reindex in VO 2.6 auch zuverlässig aus der IDE aufgerufen werden.


Übersetzung der vier Hinweise im "Link Failed!" Dialog:
  1. Nicht genügend Platz auf Laufwerk
    Auch wenn Ihre Anwendung klein sein mag, sollten Sie auf dem Ziellaufwerk mindestens 16 MB frei haben.
  2. Sie haben nur Leserechte auf dem aktuellen Laufwerk (C:\Cav026\Bin)
  3. Der Linker kann die EXE-Datei nicht öffnen,
    da diese schon existiert und vom Betriebssystem wegen eines Absturzes oder Abbruchs nicht freigegeben wurde. Verlassen Sie VO und versuchen Sie die EXE-Datei zu löschen.
  4. Ihre Indexdateien für das Repository sind nicht aktuell. Schließen Sie VO, starten Sie das Reindex-Hilfsprogramm für das aktuelle Projekt und starten Sie danach VO neu.
Kommentare: Fall 1 sollte in heutigen Zeiten bei Festplatten nicht mehr auftreten, denn wenn Sie so wenig Platz haben, sollten schon lange andere Probleme aufgetaucht sein! Und die EXE-Datei während des Linkvorgangs direkt auf andere Medien (Diskette, Memory Stick, Removeable Harddrive) schreiben zu lassen, gehört sowieso eher in den Bereich der Kamikaze-Programmierung
Fall 2 sollte eigentlich äusserst selten vorkommen.
Fall 3 sollte eigentlich schnell überprüft sein. Ggf. auch die Dateiattribute der EXE-Datei überprüfen!
Fall 4. Wir haben es oben schon einmal erwähnt: Der Repository Reindex sollte auch aus der VO-IDE erfolgreich durchgeführt werden können.

Dieser Tipp wurde zusammengestellt aus Nachrichten aus der englischsprachigen News Group zu Visual Objects und Aufzeichnungen unseres Support-Teams
 
Schicken Sie uns Ihren eigenen Tipp des Monats per Email
Druckversion anzeigen: Druckversion

 

 

Letzte Änderung des Inhalts auf dieser Seite: 18.08.03