Statisches und Dynamisches Linken



  • Hallo,

    und schönen Tag. Nachedem ich für meine letzte Anfrage in diesem Forum leider keine Antwort bekommen habe, versuche ich es nun erneut.
    Ich bin gerade dabei eine shared object library zu erstellen (so-Datei), was soweit auch unter KDevelop ganz gut klappt (g++ mit -fPIC und linken mit -shared Option). Nun möchte ich wissen, ob es möglich ist diese shared object library mit den zur Erzeugung dieser notwendigen Bibliotheken statisch zu linken. Mit anderen Worten, wie kann ich eine so-Datei erstellen und diese dabei mit anderen Bibliotheken, welche die so-Library zum Ausführen benötigt, statisch linken? Noch weiter geht meine nächste Frage. Ist es möglich bestimmte Bibliotheken statisch zur so-Datei zu linken und andere wiederum dynamisch, d.h die erstellte so-Datei lädt wiederum andere benötigte so-Dateien? So eine Art mixed linking von den verschieden Bibliotheken, die meine so-Datei braucht (manche möchte ich statisch und andere wiederum dynamisch linken).
    Danke für Eure Bemühungen
    Schöne Grüße

    Andreas



  • Terrakotta schrieb:

    anderen Worten, wie kann ich eine so-Datei erstellen und diese dabei mit anderen Bibliotheken, welche die so-Library zum Ausführen benötigt, statisch linken?

    Das sollte gehen. Du musst nur die Dateien, die du in die Bibliothek statisch reinlinken willst, als statische Biliotheken zur verfügung haben.



  • Hallo,

    und danke für Deine Antwort. Ich habe einige (nicht alle!) Bilbliotheken sowohl als statische Datei (.a-File) und dynamische Datei (.so-File). Ich will nur wissen wie man das den Linker explizit sagt, dass er für eine Bilbliothek das a-File verwenden soll und für eine andere Bibliothek die so-Datei nehmen soll, wenn ich meine eigene neue so-Bibiliothek generiere?
    Ausserdem würde mich interessieren, wie man mit libtool aus einer la-Datei entweder eine .so-Datei und/oder eine a-Datei macht?
    Danke nochmals Eure Bemühungen.
    Schöne Grüße

    Andreas



  • Terrakotta schrieb:

    Hallo,

    und danke für Deine Antwort. Ich habe einige (nicht alle!) Bilbliotheken sowohl als statische Datei (.a-File) und dynamische Datei (.so-File). Ich will nur wissen wie man das den Linker explizit sagt, dass er für eine Bilbliothek das a-File verwenden soll und für eine andere Bibliothek die so-Datei nehmen soll, wenn ich meine eigene neue so-Bibiliothek generiere?

    Gib beim linken einfach die richtige Biliothek an. Unter umständen musst du den Library-Suchpfad anpassen. Aber bist du sicher, dass die .a-Dateien statische biliotheken sind? Meistens verweisen diese auf die Dynamischen Biliotheken, und du hast nichts gewonnen. Du musst die Biliotheken warscheinlich von hand als statisch kompilieren, sonst klappt das nicht.

    Terrakotta schrieb:

    Ausserdem würde mich interessieren, wie man mit libtool aus einer la-Datei entweder eine .so-Datei und/oder eine a-Datei macht?

    Das geht schlicht und einfach nicht. .la-Dateien enthalten nur Meta-Informationen über die Biliothek.

    Wenn du was über libtool lesen, willst, kannst du dir den Autotools-Artikel anschauen. Da ist auch ein abschnitt zu libtool drin.

    Warum willst du das eigentlich machen, was du da vor hast?



  • Hallo,

    und vielen Dank nochmals für Deine Antwort. Also wozu brauch ich das?
    Das ist etwas kompliziert. Ich verwende ein komerzielles Programm von dem ich nur Executables habe, wobei das Softwaresytem allerdings nur Benutzer Programmschnittstellen für FORTRAN zur Verfügung stellt. Diese Schnittstelle funktioniert etwas sonderbar, da dabei einfach beim Start des komerziellen Programmsystems das FORTRAN Programm, dass die Benutzerschnittstelle beinhaltet, als Parameter übergeben wird. Dabei wird der FORTRAN Compiler aufgerufen und die Objektdatei des Benutzerprogramms zum komerziellen Programm dazugelinkt. Wie genau weis ich im Detail auch nicht, jedoch gehe ich davon aus dass das ganze über so-Files funktioniert. Auf diesen eben beschriebenen Vorgang habe ich allerdings keinen bis nur sehr wenig Einfluss. Da die Kernroutinen meines Benutzerprogrammteils jedoch nicht von mir in FORTRAN programmiert sind sondern in C++ ruft das FORTRAN Programm einfach meine in C++ geschrieben so-Bibliothek auf. Diese meine so-Bibliothek verwendet allerdings einige andere Bibliotheken wie bspw. blitz++, boost etc. Nun will ich meine so-Bibliothek am Besten vollständig mit den anderen Bibliotheken statisch verlinken, damit ich einfach keine Probleme bei der Sucherei während des Programmstarts mit den anderen so-Dateien habe. Dies hat unter Windows mit meiner DLL alles super funktioniert, da ich nun leider unter LINUX mit KDevelop, libtool und den ATOTOOLS nicht so vertraut bin bereitet mir das erstellen der "DLL" etwas Schwierigkeiten.
    Also nochmal meine Frage: Ist es möglich einige Dateien beim generieren meiner so-Datei statisch und andere wiederum dynamisch an meine so-Datei zu linken?
    Danke nochmals für Deine/Eure Bemühungen.
    Schöne Grüße

    Andreas



  • Terrakotta schrieb:

    Ist es möglich einige Dateien beim generieren meiner so-Datei statisch und andere wiederum dynamisch an meine so-Datei zu linken?

    ProgChild schrieb:

    Das sollte gehen. Du musst nur die Dateien, die du in die Bibliothek statisch reinlinken willst, als statische Biliotheken zur verfügung haben.

    Nochmal in ausführlich: Mit statischen Biliotheken, sollte es keine Probleme geben, da das nur Archive mit Objekt-Dateien sind. Wie es mit Dynamischen Biliotheken ist, weis ich das nicht genau. Im schlimmsten Fall geht das halt mit dlopen und Co. Du musst nur die Biliotheken statisch, bzw dynamisch compilieren und linken.



  • ProgChild schrieb:

    Terrakotta schrieb:

    Hallo,

    und danke für Deine Antwort. Ich habe einige (nicht alle!) Bilbliotheken sowohl als statische Datei (.a-File) und dynamische Datei (.so-File). Ich will nur wissen wie man das den Linker explizit sagt, dass er für eine Bilbliothek das a-File verwenden soll und für eine andere Bibliothek die so-Datei nehmen soll, wenn ich meine eigene neue so-Bibiliothek generiere?

    Gib beim linken einfach die richtige Biliothek an. Unter umständen musst du den Library-Suchpfad anpassen. Aber bist du sicher, dass die .a-Dateien statische biliotheken sind? Meistens verweisen diese auf die Dynamischen Biliotheken, und du hast nichts gewonnen. Du musst die Biliotheken warscheinlich von hand als statisch kompilieren, sonst klappt das nicht.

    hä libxxx.a sind statiche libs. Ich habe noch nie einen symlink namens libxxx.a gesehen der auf libxxx.so zeigt.



  • firefly schrieb:

    hä libxxx.a sind statiche libs. Ich habe noch nie einen symlink namens libxxx.a gesehen der auf libxxx.so zeigt.

    Hm... hast recht. Hab mich geirrt. Unter Windows generiert mir der GCC beim erstellen von DLLs .a-Dateien, die in Wirklichkeit mit der DLL linken, aber das liegt wohl an der unterschiedlichen Arbeitsweise vom ELF und dem PE-Format.

    @Thread Ersteller: Versuch mal das Argument -static beim Aufruf vom GCC, wenn du deine Dateien linkst.

    Wenn du andernfalls erzwingen willst, dass nur die statischen Biliotheken genommen werden, kannst du einfach symlinks von nur den statischen Biliotheken machen und nur diesen Order in den Biliothekssuchpfad eintragen. Das wäre aber ein Workaround.


Anmelden zum Antworten