error adding symbols: DSO missing from command line



  • Hallo!

    Ich erstelle momentan eine Library A, die Funktionen aus einer anderen Library B benutzt. Ein paar dieser Funktionen aus der Library B werden in einer Template Klasse in Library A verwendet, die zum Zeitpunkt des Kompilierens der Library A noch nicht instantiiert wird. Wenn ich diese Template Klasse in einem Programm instantiiere, das nur gegen Library A linkt, bekomme ich undefined reference to symbol Fehler für die Funktionen aus Library B, die in der Template Klasse verwendet werden. Alle Funktionen aus Library B, die im Source der Library A verwendet werden, werden jedoch ohne Probleme gefunden. Desweiteren bekomme ich den Fehler error adding symbols: DSO missing from command line . Allerdings möchte ich nicht, dass der Benutzer der Library A zusätzlich noch gegen die Library B linken muss. Ohne die Template Klasse hätte das ja auch funktioniert. Kann man da irgendwas machen, zum Beispiel irgendwie einfach alle Symbole aus Library B in Library A einbinden?

    Vielen Dank im Voraus!

    Zur Verdeutlichung hier mal ein sinnloses Beispiel:

    // libfoo.hpp
    #ifndef LIBFOO_HPP
    #define LIBFOO_HPP
    
    #include <SDL.h>
    
    template <unsigned int i>
    void init()
    {
      SDL_Init(i);
    }
    
    void win(int w, int h);
    
    #endif
    
    // libfoo.cpp
    #include<libfoo.hpp>
    
    void win(int w, int h)
    {
      SDL_CreateWindow("", 0, 0, w, h, SDL_WINDOW_SHOWN);
    }
    
    // app.cpp
    #include <libfoo.hpp>
    
    int main()
    {
      init<SDL_INIT_VIDEO>();
      win(0, 0);
      return 0;
    }
    
    # runme.sh
    g++ -fPIC -I. -I /usr/include/SDL2 -c libfoo.cpp -o libfoo.o
    g++ -shared -lSDL2 libfoo.o -o libfoo.so
    g++ -I. -I /usr/include/SDL2 -c app.cpp -o app.o
    g++ -L. -lfoo app.o -o app