Static linking ¿wie eine externe .o Datei statisch linken?

Antworten
KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Static linking ¿wie eine externe .o Datei statisch linken?

Beitrag von KOBOLD Messring GmbH »

Hallo alle zusammen,
ich habe ein recht spezielles Anliegen, vielleicht kann mir ja einer helfen:

Ich habe eine externe Bibliothek (kommerzielles Produkt), sowohl als .so (shared object) für dynamic linking als auch als .a (als AR-Archiv, enthält insgesamt 6 .o Object-Dateien) für static linking. So weit die Beschreibung des Herstellers (dort natürlich alles für C erklärt).

Wunderbar funktioniert mit Lazarus, wenn ich die .so Datei dynamisch einbinde mit folgender Deklaration:

Code: Alles auswählen

Function GetVersionAPI  : LongInt; cdecl; external 'libmxlin.so.2.6.0';

(Hat auch gedauert, bis ich drauf kam, "cdecl" statt "stdcall" zu nehmen).

Nun möchte ich aber dieses Object (oder die 6 Object-Dateien) statisch in mein Lazarus-Programm einbinden, denn ich möchte nicht, dass der Benutzer (Kunde), sein System verändern muss (also als root die libmxlin.so.2.6.0 in /usr/lib kopieren, noch 2 symlinks drauf setzen, ldconfig ausführen ...).

Gefunden habe ich jede Menge beim wiki und in den Foren, aber es hilft mir nicht, denn folgende Probleme muss ich lösen:
1.) Wenn ich in der IDE "statisches Linken" einstelle, ¿wie kann ich verhindern, dass alle Objekte statisch gelinkt werden? Denn dann würde ja auch z.B. der ganze X11-Kram statisch gelinkt werden, also mehrere 100 MB.
http://www.lazarus.freepascal.org/index ... 954.0.html

2.) ¿Welche Compiler-Direktive muss ich setzen? {$LINK xyz} oder {$LINKLIB xyz}. Ich muss gestehen, die Erläuterungen
in http://www.freepascal.org/docs-html/pro ... 80001.1.43 und
http://www.freepascal.org/docs-html/pro ... 60001.1.41 habe ich nicht ganz kapiert.

3.) ¿Welche Datei(en ?) muss ich denn nun wo angeben? ¿ {$LINK libmxlin260.a} mit der Extension .a oder ohne? ¿und welche Dateien bei der external function Deklaration, auch die libmxlin260.a oder die einzelnen (ent-ar-kten), in dem Falle die mxapi.o?

Ich habe natürlich die verschiedensten Variationen durchprobiert, auch mit -Fo Pfade angegeben, die .a und .o Dateien nach /usr/lib kopiert (und mir mein System gut verknorzt, hähähä, aber macht ja nix...) ¡aber beim Lazarus funktioniert da nichts! Nur Fehlermeldungen "Error while linking ... /usr/bin/ld cannot find ...

Vielleicht wisst Ihr ja als langjährige Experten, wie man das macht,
schon mal recht vielen Dank

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Static linking ¿wie eine externe .o Datei statisch linken?

Beitrag von Hitman »

Zu bevorzugen wäre {$LINKLIB mxlin260} - dann sucht der Linker nach libmxlin260.a ... diese kann z.B. in einem per -Fl angegebenen Verzeichnis liegen.

Statisch Linken kann aber hässlich werden, vor allem, wenn die jeweilge Lib noch einige C Abhängigkeiten hat, da die dann häufig mit einigen RTL Routinen aus FPC kollidieren. Du könntest durchaus den Mittelweg gehen, und beim Shared Object bleiben.

Möglichkeit 1: deine Anwendung wird per Shell Script gestartet, welche LD_LIBRARY_PATH auf das Verzeichnis setzt, in dem besagtes shared object zu finden ist.
Möglichkeit 2: deine Anwendung lädt die "DLL" dynamisch - LoadLibrary (unit dl) kann man auch problemlos einen absoluten Pfad zum Shared Object geben. Beispiele hierfür findest du unter anderem in den OpenGL units - aber auch generell nahezu überall in der FCL. (Weiterer Vorteil: du kannst eine eigene Fehlermeldung ausgeben, wenn die SO nicht gefunden oder geladen werden kann.)

KOBOLD Messring GmbH
Beiträge: 155
Registriert: Mi 22. Aug 2007, 14:52
OS, Lazarus, FPC: Mandriva Linux 2008 (L 0.9.28 FPC 2.2.4)
CPU-Target: 32Bit
Wohnort: 65719 Hofheim am Taunus
Kontaktdaten:

Re: Static linking ¿wie eine externe .o Datei statisch linken?

Beitrag von KOBOLD Messring GmbH »

¡Vielen Dank Hitman!
ich glaube ich werde den von Dir vorgeschlagenen Weg 2 gehen, das erscheint mir sehr "Endbenutzer-freundlich" und erleichtert ein Setup-Programm schreiben.
Vielen Dank und schönes Wochenende

Antworten