Problem mit statischem Kompilieren und Shared Object Files



  • Hallo,

    ich hoffe ich bin im richtigen Forum gelandet und kann mein Problem auch korrekt beschreiben:

    Ich habe ein Programm, für das ich gerne kleine Plugins möglich machen möchte.
    Dies ist soweit auch kein Problem.
    Das Shared Object File soll auch funktionen des Hauptprogramms nutzen können und auch das klappt soweit.

    Aber nur wenn ich das Hauptprogramm so kompiliere/linke:
    g++ -c *.cpp
    g++ -lpthread -ldl -rdynamic -o myprogram *.o

    Das Shared Object Dings kompiliere ich dann so:
    g++ -c *.cpp
    g++ -shared -o test.so *.o

    Wenn ich das so mache funktioniert auch alles.
    Nun möchte ich aber das Hauptprogramm STATISCH linken.
    Ok, also mache ich:
    g++ -c *.cpp
    g++ -rdynamic -static -o myprogram *.o /usr/lib/libpthread.a /usr/lib/libdl.a

    Wenn ich nun aber versuche im Programm das Shared Object File zu laden meldet er mir "unresolved symbol" Fehler.
    Allerdings nur, wenn ich versuche eine Funktoin des Hauptprogramms zu nutzen.
    Das heisst für mich wenn ich statisch will funktioniert das mit -rdynamic irgendwie nicht.

    Gibt es da eine Möglichkeit das dennoch hinzubekommen?
    Habe auch schon versucht das .so File auch static zu machen aber bringt nichts.

    Vielen Dank schonmal.

    Marius



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • > g++ -fPIC -DPIC -c datei.cpp
    > g++ -shared -o libdatei.so
    

    vielleicht hilft hier Positionsunabhängiger Code.

    Ansonsten brauchst du die Pfade auch nicht explizit angeben

    > g++ -static -ldl -lpthread -rdynamic demo.cpp
    

    sollte auch gehen.



  • Hallo,

    leider hat Dein Vorschlag auch nicht funkioniert.
    Solange ich nicht versuche eine Funktion des Hauptprogramms zu verwenden im Code der shared Datei klappts wunderbar.
    Und wenn ich nicht -static mache klappts auch, dann sogar mit solchen Aufrufen.



  • gerade hab ich mal ein wenig rumprobiert. libdl scheint mit -static nicht zu gehen. Bei mir kommt folgende Warnung

    > g++ -rdynamic shared_main.cpp -static /usr/lib/libdl.a
    /tmp/ccn7awh1.o(.text+0x12b): In function `main':
    : warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
    


  • Seltsam, die Warnung kommt bei mir gar nicht.
    Er kompiliert und linkt das Ganze ohne Mucken.

    Aber was bedeutet die Warnung?
    Kann man irgendwie die libc.so auch mit dlopen oder so in das Programm laden bevor man die anderen lädt?


Anmelden zum Antworten