Вы не можете ожидать, чтобы dlfunc
был предоставлен в других UNIX, но его реализация проста и переносима. Вы можете сделать что-то вроде
# configure.ac
AC_SYSTEM_EXTENSIONS
AC_CHECK_FUNCS([dlfunc])
// some common header
#include "config.h"
#ifndef HAVE_DLFUNC
/* copied from FreeBSD, source/include/dlfcn.h */
struct __dlfunc_arg {
int __dlfunc_dummy;
};
typedef void (*dlfunc_t)(struct __dlfunc_arg);
dlfunc_t dlfunc(void *restrict handle, void *restrict symbol);
#endif
// some source file
#include "config.h"
#ifndef HAVE_DLFUNC
/* copied from FreeBSD, lib/libc/gen/dlfunc.c */
dlfunc_t dlfunc(void *restrict handle, void *restrict symbol) {
union {
void *d;
dlfunc_t f;
} rv;
rv.d = dlsym(handle, symbol);
return rv.f;
}
#endif
если вы используете Autoconf и другие системы сборки + конфигурации, вероятно, имеют аналогичные возможности. (dlsym
гораздо более широко доступен.)
При этом, я думаю, что предупреждение компилятора глупо & ndash; Стандарт C этого не делает, но POSIX гарантирует, что указатели void *
могут безопасно представлять все указатели функций & hellip;