Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dlfunc的可移植性?_C_Dlopen - Fatal编程技术网

dlfunc的可移植性?

dlfunc的可移植性?,c,dlopen,C,Dlopen,我正在阅读dlopen和FreeBSD上的朋友的手册页。我正在开发一个跨平台的应用程序,它使用共享库来加载插件。我以前从未这样做过,但我想我已经很好地掌握了它的工作原理。手册页中提到了dlsym(),这似乎是从共享库中获取函数指针的常用方法,以及dlfunc(),它可以避免编译器抱怨将void*强制转换为函数指针。dlsym()更常见(可移植性)有什么原因吗?我想知道是应该使用dlfunc()来避免编译器问题,还是应该使用dlsym()。dlfunc()是否可移植?当你说跨平台时,你是指跨POS

我正在阅读dlopen和FreeBSD上的朋友的手册页。我正在开发一个跨平台的应用程序,它使用共享库来加载插件。我以前从未这样做过,但我想我已经很好地掌握了它的工作原理。手册页中提到了dlsym(),这似乎是从共享库中获取函数指针的常用方法,以及dlfunc(),它可以避免编译器抱怨将void*强制转换为函数指针。dlsym()更常见(可移植性)有什么原因吗?我想知道是应该使用dlfunc()来避免编译器问题,还是应该使用dlsym()。dlfunc()是否可移植?

当你说跨平台时,你是指跨POSIX平台还是也需要Windows支持

如果你在C++中工作,你可以看看。这就考虑了Windows与UNIX的可移植性

如果您正在寻找仅适用于UNIX的建议,请查看


据我所知,dlsym是标准的UNIX方式。Windows有一种相同但完全不同的操作方式。

当你说跨平台时,你是指跨POSIX平台还是也需要Windows支持

如果你在C++中工作,你可以看看。这就考虑了Windows与UNIX的可移植性

如果您正在寻找仅适用于UNIX的建议,请查看


据我所知,dlsym是标准的UNIX方式。Windows有一种等效但完全不同的操作方式。

您不能期望在其他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*
指针可以安全地表示所有函数指针…

您不能期望在其他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*
指针可以安全地表示所有函数指针…

在这种情况下,跨平台就是跨POSIX。我几乎不想开始钻研Windows编程的黑暗深处。HP-UX——至少在PA-RISC机器上(我知道,正朝着过时的方向发展)有一个单独的系统。我认为IA64机器使用dlsym()/dlopen()。是的,PA-RISC上的32位HP-UX使用SOM格式(shlib_*函数),这有点讨厌(显然不进行引用计数)。PA-RISC上的64位HP-UX使用ELF,ia64上的32位和64位HP-UX都使用ELF——它们具有更健全的dl*接口。本例中的跨平台是跨POSIX。我几乎不想开始钻研Windows编程的黑暗深处。HP-UX——至少在PA-RISC机器上(我知道,正朝着过时的方向发展)有一个单独的系统。我认为IA64机器使用dlsym()/dlopen()。是的,PA-RISC上的32位HP-UX使用SOM格式(shlib_*函数),这有点讨厌(显然不进行引用计数)。PA-RISC上的64位HP-UX使用ELF,ia64上的32位和64位HP-UX都使用ELF——它们具有更健全的dl*接口。