c - dlfunc 的可移植性?

标签 c dlopen

我正在阅读 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/

相关文章:

c编程gcc错误: assignment from incompatible pointer type [enabled by default]

c - 函数未初始化

c - 程序一直崩溃

c - 通过 C 使用 Windows 读取 '\n'(换行符)终止的字符串

c - 为什么insertBeg不在开头插入节点

c++ - 运行时动态加载和单例

c++ - c/c++ Linux 相当于 "bool DllMain()"- 但我需要将失败返回给 dlopen()

c - dlclose 加载了 RTLD_NODELETE 的库

shared-libraries - perl6 NativeCall 在 Darwin 上找不到库

c - 使用 MinGW 防止在 C(而非 C++)中进行名称重整以进行动态符号搜索