Linker friert ein

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Linker friert ein

Beitrag von Bergmann89 »

Hey,

ich hab ein seltsames Problem, bei dem ich nicht weiter weiß. Ich hab verschiedene Units, die ich in verschiedenen Projekten nutze. Diese Units nutzen eine Unit "uGlobal". "uGlobal" wird in jedem Projekt seperat angelegt und enthält eine Methode um Log-Einträge zu schreiben. Je nach Anwendungstyp wird das Log in eine Datei, in die Konsole oder in eine ListBox oder ähnliches geschrieben. Das hat bis jetzt auch super funktioniert. Heute hab ich ein neues Projekt angefangen wo ich auch die besagten Units nutze. Das Projekt is ein Konsolenprojekt. Sobald ich eine Unit "uGlobal" erstelle die eine einzige leere Methode "LogMsg(const aMsg: String)" erstelle, hängt sich der Linker beim kompilieren auf :/ Ich hab das Ganze auch mit einem komplett neuen Konsolen-Projekt versucht: gleiches Ergebnis. Mit normalen Anwendungen mit grafischer Oberfläche funktioniert alles 1a. LCL ist aber auch in das Konsolenprojekt eingebunden, da ich da einige Klassen nutze. Hat jmd ne Idee wo da der Fehler ist?

MfG Bergmann.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Linker friert ein

Beitrag von Socke »

Bergmann89 hat geschrieben:Hat jmd ne Idee wo da der Fehler ist?
Leider nicht.
Bergmann89 hat geschrieben:"uGlobal" wird in jedem Projekt seperat angelegt und enthält eine Methode um Log-Einträge zu schreiben.
Es gibt bessere Vorgehensweisen: du erstellt in Lazarus ein Package mit all deinen projektunabhängigen Units. Dort erstellst du auch eine Unit uGlobal. Diese enthält jedoch eine Variable, in der die Log-Funktion gespeichert wird.
In jedem Projekt kannst du immer noch eine eigene Log-Funktion implementieren und diese in der Unit uGlobal einsetzen.

Vorteile: Deine projektunabhängigen Units sind an sich vollständig und können kompiliert werden, ohne dass die genau Log-Funktion bekannt sein muss. Die Units müssen nicht für jedes Projekt neu übersetzt werden (Lazarus erledigt das automatisch für dich, falls es notwendig sein sollte).

Nachteil: Du hast eine zusätzliche globale Variable sowie eine Unit, die nichts weiter als eine Typendefinition, diese Variable und gegebenenfalls eine Standardimplementierung (Nichts tun) enthält. Dein fertiges Programm wird dadurch leicht größer (im 1 bis 2 stelligen Kilobyte-Bereich) und benötigt ein wenig mehr Zeit zum Starten und Beenden (prozessorabhängig, hier vermutlich im Bereich von Nanosekunden).

Fazit: Die Nachteile sind vermutlich noch nicht einmal sichtbar.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: Linker friert ein

Beitrag von Bergmann89 »

Hey,

ich hab das jetzt nicht in nem extra Packet probiert, aber mit ner Callback-Funktion bleibt der Linker auch hängen. Ich vermute sehr stark, das dort irgendwas in der LCL drin ist, das bei der COnsolenanwendung nicht richtig initialisiert wird und sich dann beim Linken verklemmt. Ich werd morgen mal die ganzen LCL-Sachen mit nem globalen $DEFINE raus schmeißen. Hoffentlich funktioniert das...

MfG Bergmann.

martin_frb
Beiträge: 593
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Linker friert ein

Beitrag von martin_frb »

Platform? win, linux, mac?

Auf win kommt der Linker mit fpc, ansonsten ist der teil der Linux/Mac Distro.

Auf win: versuche -Xe (external linker)

---
Unhabhaengig: Schau dir LazLogger[Base] an. Ist ne log utility. Hat callbacks, oder Du kannst von der Klasse erben...

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: Linker friert ein

Beitrag von Bergmann89 »

Hey,

läuft auf Windows sowohl 64 als auch 32bit. Linux hab ich noch nich probiert.
Wenn ich -Xe nutze, dann friert er nicht ein, sondern spuckt n Fehler aus: "error while linking"
Ich werd jetzt erstma die LCL raus werfen, wie ich das oben schon angedeutet hatte. Danach guck'mer weiter...

MfG Bergmann

martin_frb
Beiträge: 593
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Linker friert ein

Beitrag von martin_frb »

Dann solltest Du versuchen, einen reproduzierbaren test zu machen, und einen bug reporten.

BTW: Welche Fehler Meldung?

Hast Du *alle* dateien "clean build"?

Suche nach doppelten .ppu oder .o dateien (in allen directories)

Bergmann89
Beiträge: 98
Registriert: Di 15. Nov 2011, 11:36

Re: Linker friert ein

Beitrag von Bergmann89 »

Hey,

der Fehler ist leider nur mit meinen Units reproduzierbar und das wird zu aufwendig das zu Suchen. Vorallem wenn mal nicht ma ne ordentliche Fehlermeldung bekommt. Die Fehlermeldung war wortwörtlich: "error while linking" ^^
CleanBuild hab ich gemacht, hilft nix. Ich hab bei mir alle Binarys vom Projekt in nem extra Directory. Das hab ich gelöscht und alles neu erzeugen lassen. Hat auch nix geholfen. Ich hab jetzt alles was mit der LCL und visuellen Sachen zu tun hat mit globalen $DEFINE raus geschmissen. Jetzt gehts. Langsam glaub ich, dass das gar kein Bug ist, sondern einfach LCL und Konsolenanwendung nicht funktioniert, weil die LCL ja nicht richtig initialisiert wurde...

MfG Bergmann.

martin_frb
Beiträge: 593
Registriert: Mi 25. Mär 2009, 21:12
OS, Lazarus, FPC: Laz trunk / fpc latest release / Win and other
CPU-Target: mostly 32 bit

Re: Linker friert ein

Beitrag von martin_frb »

Bergmann89 hat geschrieben:Hey,

der Fehler ist leider nur mit meinen Units reproduzierbar und das wird zu aufwendig das zu Suchen. Vorallem wenn mal nicht ma ne ordentliche Fehlermeldung bekommt. Die Fehlermeldung war wortwörtlich: "error while linking" ^^
"Copy all and hidden messages"? Manchmal ist die eigentlich wichtige Nachricht versteckt.
Langsam glaub ich, dass das gar kein Bug ist, sondern einfach LCL und Konsolenanwendung nicht funktioniert, weil die LCL ja nicht richtig initialisiert wurde...
Oh, ja, hm haete ich eher sehen sollen.

Wenn du LCL nutzt, MUSST du die unit "interfaces" selbst einbinden. Die ist bei Konsole nicht enthalten. BTW, ggf LCL fuer "nogui" statt "win32" nutzen.

Antworten