Probleme bei g++ und gmodule



  • Hallo,

    ich will ein kleines Testprogramm schreiben für glib und c++.
    Nur leider komm ich mit den gcc flags nicht ganz klar
    Er kompiliert zwar ohne Probleme, aber wenn ich mein Programm aufrufe bekomm ich immer die Fehlermeldung

    `_fabrik': ./nummer1.so: undefined symbol: _fabrik
    

    prog.cpp

    #include <stdlib.h>
    #include <stdio.h>
    #include <glib.h>
    #include <gmodule.h>
    #include "basis.hpp"
    
    Produkt * finder(){
      fabrik_p fabrik;
      GModule *mod_handler;
    
      mod_handler = g_module_open("./nummer1.so", G_MODULE_BIND_LAZY);
      if (!mod_handler) {
        puts("Fehler beim laden");
        printf("%s\n", g_module_error());
        exit(0);
      }
    
      if (!g_module_symbol(mod_handler, "_fabrik", (gpointer*)&fabrik)) {
        puts("Fehler beim laden 2");
        fprintf(stderr, "%s\n", g_module_error());
        return NULL;
      } else {
        return fabrik();
      }
      return NULL;
    }
    
    int main(int argc, char** argv) {
      Produkt * prod;
      prod = finder();
      if (prod == NULL) {
        exit(1);
      }
      printf("schnittstelle: %d\n", prod->schnittstelle());
      exit(0);
    }
    

    basis.hpp

    #ifndef BASIS_HPP
    #define BASIS_HPP
    
    class Produkt {
      public:
        virtual int schnittstelle(void);
    };
    
    typedef Produkt* (*fabrik_p) (void);
    
    #endif
    

    nummer1.cpp

    #include "basis.hpp"
    //#include <gmodule.h>
    
    class nummer1 : public Produkt {
      public:
        int schnittstelle(void);
    };
    
    extern "C" {
      Produkt* _fabrik() {
        return new nummer1();
      }
    }
    

    Compilier mit den zwei Befehlen

    $ g++ `pkg-config --cflags --libs glib-2.0 gmodule-2.0` -o prog prog.cpp
    $ gcc -shared -fPIC -Wl,-soname -g -o nummer1.so nummer1.cpp
    

    Hat einer ne Ahnung was ich falschmache bzw. vergesse.

    Danke.



  • Du solltest deine library auch zu deinem programm dazulinken. Zum erzeugen der library brauchst du auf jeden Fall g++.

    $ g++ -shared -fPIC -Wl,-soname -g -o nummer1.so nummer1.cpp
    $ g++ `pkg-config --cflags --libs glib-2.0 gmodule-2.0` -L./ -o prog prog.cpp nummer1.so
    

    Sollte gehen.
    Kurt



  • Ich will die Library nicht zum Programm linken, weil ich später eine Plugin-Struktur haben will, und da ja nicht die Module kennen die es gibt.
    Auch mit g++ kommt immer noch die selbe Fehlermeldung



  • Sorry hab dein posting wohl nicht richtig gelesen.
    Hab zwar noch nie mit gmodules gearbeitet wollte es aber trotzdem wissen.
    So gehts.
    basis.hpp

    #ifndef BASIS_HPP
    #define BASIS_HPP
    #include <gmodule.h>
    
    class Produkt {
      public:
        virtual int schnittstelle(void)=0;
    };
    
    typedef Produkt* (*fabrik_p) (void);
    
    extern "C" {
       G_MODULE_EXPORT Produkt* fabrik();
    }
    #endif
    

    prod.cpp

    #include <stdlib.h>
    #include <stdio.h>
    #include <glib.h>
    #include <gmodule.h>
    #include "basis.hpp"
    
    Produkt * finder(){
      fabrik_p fabrik;
      GModule *mod_handler;
    
      mod_handler = g_module_open("./nummer1.so", G_MODULE_BIND_LAZY);
      if (!mod_handler) {
        puts("Fehler beim laden");
        printf("%s\n", g_module_error());
        exit(0);
      }
    
      if (!g_module_symbol(mod_handler, "fabrik", (gpointer*)&fabrik)) {
        puts("Fehler beim laden 2");
        fprintf(stderr, "%s\n", g_module_error());
        return NULL;
      } else {
        return fabrik();
      }
      return NULL;
    }
    
    int main(int argc, char** argv) {
      Produkt * prod;
      prod = finder();
      if (prod == NULL) {
        exit(1);
      }
      printf("schnittstelle: %d\n", prod->schnittstelle());
      exit(0);
    }
    

    nummer1.cpp

    #include <glib.h>
    #include <gmodule.h>
    #include "basis.hpp"
    
    class nummer1 : public Produkt {
      public:
        int schnittstelle(void) {}
    };
    int x;
    
    G_MODULE_EXPORT Produkt* fabrik() {
        return new nummer1();
    }
    

    kompilieren mit

    g++ `pkg-config --cflags --libs glib-2.0 gmodule-2.0` -shared  -o nummer1.so 
    g++ `pkg-config --cflags --libs glib-2.0 gmodule-2.0` -o prog prog.cpp
    

    Kurt



  • Danke für deine Antwort. Klapp soweit. Habs in der Zwischenzeit mal schritt für Schrittversucht und auch zum laufen gebracht.

    Danke 👍


Anmelden zum Antworten