Ich habe Tage damit verbracht, alle Tutorials zu lesen und zu lesen, die ich zu diesem Thema gefunden habe, und verbrachte Stunden (und sogar Tage) damit, verwandte Fragen hier in SO zu durchstöbern, aber ich kann immer noch nicht alles zum Laufen bringen. Akzeptieren Sie meine Entschuldigung, wenn es sich um ein Duplikat handelt: Die Chancen stehen gut, dass ich die Duplikatsfragen oft gesehen und wieder gelesen habe, aber die Relevanz der Antworten auf mein Problem nicht verstehen konnte. Mit diesem aus dem Weg ...Wie manipuliere/gebe ich Daten mit dynamisch geladenen Funktionen zurück (dlopen)?
Ich versuche, eine Plugin-Architektur für meine Anwendung zu implementieren. Plugins werden kompiliert und als Bibliotheken installiert. Zur Laufzeit verwendet die Anwendung dann dlopen()/dlsym(), um die Funktionen des Plugins zu laden und zu verlinken.
Die Idee ist, dass Plugins (Bibliotheken) eine Reihe von Funktionen implementieren, um Daten an die Hauptanwendung zurückzugeben, oder manipulieren Daten von der Anwendung übergeben.
Um diese Idee zu testen, habe ich versucht, eine Funktion (innerhalb des Plugins) zu implementieren, die den (lesbaren) Namen des Plugins selbst (als std :: string) zurückgeben würde. Ich dachte, dass wäre etwas einfach, mit zu beginnen ....: -/
Hier ist, was ich bisher habe:
// Plugin.cpp
extern "C" void plugin_name(std::string *name) {
name = new std::string("Example plugin name");
}
// Application.cpp
void* handle = dlopen("libplugin.so", RTLD_LAZY);
typedef void (*plugin_t)(std::string*);
dlerror(); // Reset errors.
plugin_t call_plugin_name = (plugin_t) dlsym(handle, "plugin_name");
// ... Some error handling code.
std::string my_plugin_name;
call_plugin_name(&my_plugin_name);
dlclose(handle);
// More code that displays my_plugin_name.
ich viele verschiedene Kombinationen ausprobiert habe, darunter eine, die mehr straigtforward schien (aber nicht funktionierte besser), wo der Plugin-Name zurückgegeben wird:
ich weiß, ich bin in der Nähe: der Code kompiliert und die Anwendung gestoppt Absturz;)
aber ich habe eine leere Platz, wo ich erwarten würde, das tatsächliche plugin nam zu sehen e.
Alle Tutorials, die ich bisher gelesen habe, gehen sehr schnell über den Mechanismus, mit dem Daten in beide Richtungen übergeben werden: Plugin < => Anwendung. Was ich mit einer "einfachen" std :: string versuche, möchte ich später mit viel komplexeren Objekten machen (d. H. Eine Plugin-Funktion würde ein Objekt als Referenz nehmen und einige seiner Eigenschaften ändern). Die Tutorials halten mehr oder weniger an dem Punkt an, an dem mit dlsym() ein Zeiger erzeugt wird, und geben nicht viele Beispiele zur Verwendung dieses Zeigers.
Also, wie all das zu tun?
Eine weitere relevante Frage: verwende ich eine gemeinsame Kopfzeile, die ich sowohl mit der Anwendung und mit dem Plugin verwenden würde und wo würde ich die Signatur der Funktion Anrufe definieren? Wie würde ich das machen und wie würde das helfen?
Können Sie es mit einem normalen 'char *' arbeiten lassen? – genpfault
@genpfault: lass mich versuchen und ich komme zurück zu dir;) Ich habe mich gefragt, ob die Verwendung einer std :: string (eine C++ - Klasse) Probleme verursacht ... – augustin
Ich habe ein paar Kommentare zu meiner Antwort – ssmir