Ваша декларация func
запутана:
int *(func)(void);
эквивалентно:
int *func(void);
так что вы просто даете компилятору прототип для func
без объявления переменной; ошибка возникает из-за того, что функция не является допустимым lvalue; тем не менее, указатель на функцию является допустимым значением lvalue, поэтому вы хотите следующее:
int (*func)(void);
И тогда ваш printf
должен быть таким:
printf("%d\n", func());
Вам также понадобится привести результат из dlsym
, чтобы он строго соответствовал стандарту C:
func = (int (*)(void))dlsym(dlopen("/home/noah/tmp/libmod.so.1", RTLD_LAZY), "func");
Указатель void*
может быть тихо обновлен до любого другого типа указателя, кроме указателя на функцию; gcc -pedantic
, например, предупредит, что «ISO C запрещает присваивание между указателем функции и« void * »без использования приведения. У меня нет удобной копии стандартного (но кто-то здесь, конечно, есть), поэтому я не могу цитировать главу и стих, но caf верен в этом вопросе (спасибо caf).
И вы также хотите добавить в закладки cdecl.org .