Hallo zusammen!
Mit C/C++ möchte ich gerne unter Linux mein Programm mittels Shared Libraries dynamischer gestalten. Zum einen sollen Nutzer eigene Plugins einbinden dürfen und zum anderen sollen bestimmte Programmmodule in Shared Libraries ausgelagert werden um das Programm besser warten zu können. Mit Google bin ich schon etwas vorangekommen.
Meine Shared Library zum üben sieht wie folgt aus:
#include
int dll_function(char *message){
printf(„dll: %s\n“, message);
return 0;
}
Die Library (im folgendem nur noch Lib) bekommt einen String übergeben den diese ausgibt. Übersetzen tue ich das Programm wie folgt:
gcc -fpic -c dll.c
gcc -shared -o testlib.so dll.o
Auf diese –soname Geschichte habe ich bewusst verzichtet *, da ich die Libs nur für mein Programm bereitstellen möchte und darum nicht in /opt, /usr/local oder sonst wo brauche.
Diese Lib möchte ich nun in mein Programm einbinden. Darüber hinaus soll mit dynamic linking (#include ) der Nutzer das Programm selbst erweitern können. Der Einfachheit halber verwende ich dafür die gleiche Lib dll.so. Allerdings konnte ich auf keinem der beiden Wege das Programm zum Laufen bekommen. Hierzu mein Vorgehen und die Fehlermeldungen:
#include
int dll_function(char *message);
int main(int argc, char *argv[]){
dll_function („hello world“);
printf(„main-programm is running …\n“);
return 0;
}
Das habe ich dann mit gcc main.c dll.so warnungs- und fehlerfrei übersetzt und beim Ausführen folgende Meldung erhalten:
./a.out: error while loading shared libraries: dll.so: cannot open shared object file: No such file or directory
main.c und dll.so befinden sich im gleichen Verzeichnis und haben beide Lese- und Schreibrecht für meinen Benutzer.
#include
#include
typedef void (*send_message)();
int main(int argc, char *argv[]){
void *lib = dlopen(„dll.so“, RTLD_NOW);
if(!lib){
printf(„ERROR: can’t load dll.so\n“);
eturn -1;
}
send_message dll = (send_message)dlsym(lib, „dll_function“);
dll(„hello world“);
rintf(„main-programm is running …\n“);
dlclose(lib);
return 0;
}
Hier gibt es schon beim Übersetzen Probleme:
/tmp/ccS4ndqD.o(.text+0x1a): In function main': undefined reference to
dlopen’
/tmp/ccS4ndqD.o(.text+0x4b): In function main': undefined reference to
dlsym’
/tmp/ccS4ndqD.o(.text+0x77): In function main': undefined reference to
dlclose’
collect2: ld returned 1 exit status
Eine ausführbare Datei wird erst gar nicht erzeugt. Dem Compiler –ldl mitzugeben bringt auch nichts.
Wie leicht zu erkennen ist habe ich nicht wirklich viel Ahnung davon und mehr durch ausprobieren der verschiedenen Internettutorials eine Lösung zu finden versucht. Meine Frage ist darum auch „ganz kurz“: Wie geht es richtig, also so das es funktioniert?
Grüße
C. Penkwitt
* Auch wenn ich diese Option aktiviert habe, bin ich nicht weiter gekommen!