gpt4 book ai didi

c - dlfunc 的可移植性?

转载 作者:太空宇宙 更新时间:2023-11-04 01:43:11 25 4
gpt4 key购买 nike

我正在阅读 dlopen 和 FreeBSD 上 friend 的联机帮助页。我正在开发一个跨平台应用程序,该应用程序将共享库用于可加载插件。我以前从未这样做过,但我认为我对它的工作原理有一定的了解。联机帮助页提到了 dlsym(),它似乎是从共享库获取函数指针的常用方法,还有 dlfunc(),据说它可以避免编译器对将 void* 转换为函数指针的提示。有没有 dlsym() 更常见的原因(可移植性?)?我想知道我是应该使用 dlfunc() 来避免编译器问题,还是应该使用 dlsym()。 dlfunc() 是可移植的吗?

最佳答案

您不能指望在其他 UNIX 上提供 dlfunc,但它的实现简单且可移植。你可以做类似的事情

# 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 的应用更为广泛。)


话虽如此,我认为编译器警告很愚蠢——C 标准没有,但 POSIX 保证 void * 指针可以安全地表示所有函数指针……

关于c - dlfunc 的可移植性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1144107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com