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