Wie ordne ich einen von dlsym zurückgegebenen Zeiger korrekt einer Variablen vom Typ Funktionszeiger zu?

Ich versuche, @ zu verwenddlopen() unddlsym() in meinem Code und kompiliere es mitgcc.

Hier ist die erste Datei.

/* main.c */

#include <dlfcn.h>

int main()
{
    void *handle = dlopen("./foo.so", RTLD_NOW);

    if (handle) {
        void (*func)() = dlsym(handle, "func");
        func();
    }

    return 0;
}

Hier ist die zweite Datei.

/* foo.c */

#include <stdio.h>

void func()
{
    printf("hello, world\n");
}

Hier erfahren Sie, wie ich den Code kompiliere und ausführe.

$ gcc -std=c99 -pedantic -Wall -Wextra -shared -fPIC -o foo.so foo.c
$ gcc -std=c99 -pedantic -Wall -Wextra -ldl -o main main.c
main.c: In function ‘main’:
main.c:10:26: warning: ISO C forbids initialization between function pointer and ‘void *’ [-Wpedantic]
         void (*func)() = dlsym(handle, "func");
                          ^
$ ./main
hello, world

Wie kann ich die Warnung loswerden?

Type Casting hilft nicht. Wenn ich versuche, cast einzugeben, wird der Rückgabewert vondlsym() in einen Funktionszeiger, bekomme ich stattdessen diese Warnung.

main.c:10:26: warning: ISO C forbids conversion of object pointer to function pointer type [-Wpedantic]
         void (*func)() = (void (*)()) dlsym(handle, "func");
                          ^

Was würde den Compiler davon überzeugen, dass dieser Code in Ordnung ist?

Antworten auf die Frage(12)

Ihre Antwort auf die Frage