2016-04-22 9 views
0

ich ein Plugin-System schreibe die drei Module andere getrennt ist:C pluginsystem: Symbol Lookup-Fehler

  1. plugin_system.c - das Herzstück des Systems
  2. list.c - enthält ein verkettete Liste Implementierung für Plugins Lagerung
  3. 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 ...

+0

verwenden Sie keine weiteren compliation Befehl haben „plug_system.o“ zu generieren? Bitte zeigen Sie uns alle Ihre Kompilierungsbefehle. – jdarthenay

+0

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 ... –

+0

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

Antwort

0

ich habe vergessen, nur das Plugin mit list.o zu verbinden, die von der plugin_system.o verwendet wird ...