ich ein Plugin-System schreibe die drei Module andere getrennt ist:C pluginsystem: Symbol Lookup-Fehler
- plugin_system.c - das Herzstück des Systems
- list.c - enthält ein verkettete Liste Implementierung für Plugins Lagerung
- plugin_interface.h - die Erklärung von Plugins benötigt enthält, hat keine Quelldatei zugeordnet
plugin_interface.h nur enthält nur von Typen und die Funktion:
extern int plugin_register(PluginManager *plug_manager, const char *name, Plugin *plug);
, die in plugin_system.c definiert ist
Wenn ein Plugin geladen, das Plugin-System, suchen nach einem funcion init_plugname()
und rufen Sie, diese Funktion muss plugin_register
aufrufen, um das Plugin zu registrieren.
Das Programm mit komplexem rekursiven Makefiles kompiliert wird (nicht die beste Idee), aber was ich versuche zu erreichen ist:
ich das Plugin Systemobjekt in dem Hauptprogrammordner zu kompilieren, wird es dann mit dem Haupt verbunden Programm. Von make
Ausführung:
gcc -Wall -O2 -std=gnu99 -D DEBUG -g -fPIC -c -o /home/kowa/code/reseaux/projet/ringo/c/bin/list.o list.c
gcc -Wall -O2 -std=gnu99 -D DEBUG -g -fPIC -c -o /home/kowa/code/reseaux/projet/ringo/c/bin/plugin_system.o plugin_system.c
Ein Plugin mit gcc -fPIC -c -o plugname.o plugname.c plug_system.o
gefolgt von gcc -o plugname.so plugname.o plug_system.o -shared
zusammengestellt versuche ich das Plugin in meinem Hauptprogramm zu laden und diese Fehlermeldung erhalten:
symbol lookup error: ./plugins/zyva.so: undefined symbol: exists
exists
ist eine Funktion In dem Listenmodul, das von dem Modul plugin_system zum Speichern von Plugins verwendet wird, ruft die oben erwähnte plugin_register
-Funktion es auf.
Ich habe noch nie diese Art von System vorher getan und ich bin kein Experte in gemeinsam genutzten Bibliothek, ich denke, das Problem aus ist, wie ich das ganze Projekt zu kompilieren, kann ich eine Verknüpfung verpassen ...
verwenden Sie keine weiteren compliation Befehl haben „plug_system.o“ zu generieren? Bitte zeigen Sie uns alle Ihre Kompilierungsbefehle. – jdarthenay
Ich habe die Kompilierbefehle für das Plugin-System hinzugefügt, ich kann alle Befehle einfügen, wenn Sie wollen, aber die anderen sind für andere Teile der Projekte, also ist es vielleicht nicht relevant ... –
Ich habe versucht, eine kleine dynamische Bibliothek zu erstellen mit zwei Objektdateien so, wie Sie es tun, und ich habe kein Problem, sie miteinander zu verbinden ... Sind Sie sicher, dass es keinen Fehler gibt, wie Sie 'exists()' in jede Quelldatei schreiben? Stellen Sie sicher, dass Sie 'exist()' nicht geschrieben haben. – jdarthenay