1

FreeBSDのdlopenとその仲間たちのマンページを読んでいます。ロード可能なプラグインに共有ライブラリを使用しているクロスプラットフォームアプリケーションに取り組んでいます。私はこれまでこれを行ったことがありませんが、それがどのように機能するかを十分に理解していると思います。マンページには、共有ライブラリから関数ポインタを取得する一般的な手段のように見えるdlsym()と、関数ポインタにvoid*をキャストすることに関するコンパイラの苦情を回避するdlfunc()が記載されています。dlsym()がより一般的である理由はありますか(移植性?)?コンパイラの問題を回避するためにdlfunc()を使用するべきか、それともdlsym()を使用するべきか疑問に思っています。dlfunc()は移植可能ですか?

4

2 に答える 2

3

他の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 *ポインタがすべての関数ポインタを安全に表すことができることを保証します…

于 2009-07-17T16:14:04.783 に答える
1

クロスプラットフォームとは、クロスPOSIXプラットフォームを意味しますか、それともWindowsサポートも必要ですか?

C ++で作業している場合は、Boost.Extensionプロポーザルコードを確認できます。これにより、WindowsとUNIXの移植性が向上します。

UNIXのみのアドバイスをお探しの場合は、SingleUNIXSpecificationをご覧ください

私の知る限り、dlsymはUNIXの標準的な方法です。Windowsには、同等ですが完全に異なる方法があります。

于 2009-07-17T16:01:00.817 に答える