Shared object bauen



  • Mahlzeit!

    Ich bin gerade etwas verwirrt bzgl. shared objects. Folgende Situation:
    Ordner libOSG mit myOSG.h und myOSG.cpp:

    // myOSG.h
    void printOSG();
    
    // myOSG.cpp
    #include <cstdio>
    
    void printOSG() {
      printf("Hello OSG!!\n");
    }
    

    myOSG.cpp kompiliere ich zu seinem so namens libMyOSG.so

    Ferner einen Ordner libRoot mit myRoot.h und myRoot.cpp:

    // myRoot.h
    void printRoot();
    
    // myRoot.cpp
    #include <cstdio>
    #include "myOSG.h"
    
    void printRoot() {
      printf("Hello Root\n");
    
      printOSG();
    

    myRoot.cpp kompiliere ich nun ebenfalls zu einem .so:

    g++ -fPIC -c -I../libOSG myRoot.cpp
    g++ -shared -o libMyRoot.so -Wl,-soname,libMyRoot.so myRoot.o

    Und das funktioniert auch un erzeugt ein libMyRoot.so. Aber das verstehe ich nicht, denn myRoot.cpp ruft ja printOSG() auf, das heisst libMyRoot.so ist abhaengig von libMyOSG.so!
    Sprich, ich haette erwartet dass ich das hier schreiben muss:

    g++ -fPIC -c -I../libOSG myRoot.cpp
    g++ -shared -o libMyRoot.so -Wl,-soname,libMyRoot.so -L../libOSG -lMyOSG myRoot.o

    Wieso kann libMyRoot.so erzeugt werden, obwohl ich -lMyOSG NICHT angegeben habe?



  • Meines Wissens werden die Symbole erst vollstaendig aufgeloest, wenn du ein fertiges executable linkst.

    Du kannst das aber das erwartete Verhalten forcieren mit ld --no-undefined.



  • Kann da sonst noch jemand was dazu sagen?

    libMyRoot.so haengt ja von libMyOSG.so ab. Sagen wir ich will ein Executable exe erstellen, dass die libMyRoot.so benutzt.
    2 Faelle:

    1. Wenn ich beim Erstellen von libMyRoot.so NICHT libMyOSG.so dazu gelinkt habe,
      dann muss ich beim Erstellen des Executables exe sowohl libMyRoot.so als auch libMyOSG.so angeben. Ich muss quasi wissen, dass libMyRoot.so intern noch eine unaufgeloeste Abhaenigigkeit hat. Ist das so richtig?

    2. Wenn ich beim Erstellen von libMyRoot.so bereits libMyOSG.so dazu gelinkt habe, muss ich beim Erstellen des Executables exe nur noch libMyRoot.so dazu linken, oder?


Anmelden zum Antworten