2009-07-17 21 views
1

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

答えて

3

dlfuncは他のUNIXには提供されませんが、その実装は簡単で移植性があります。 Autoconfを使用している場合には、

# 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 

などのような操作を行うことができます。他のビルド+設定システムにはおそらく同様の機能があります。 (。dlsymがはるかに広く利用可能である)


言われていること、私は、コンパイラの警告は、Cの標準はしませんが、POSIXはvoid *ポインタが安全に、すべての関数ポインタ&hellipを表現できることを保証愚か–だと思います。

1

クロスプラットフォームと言えば、クロスPOSIXプラットフォームを意味するのですか、Windowsサポートも必要ですか?

C++で作業している場合は、Boost.Extension proposal codeをご覧ください。これは、WindowsとUNIXの移植性を考慮しています。

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

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

+0

この場合のクロスプラットフォームはクロスPOSIXです。私は、Windowsプログラミングの暗い深みを掘り起こす欲求がほとんどありません。 – Edward

+0

HP-UX - 少なくともPA-RISCマシン(古風に近づいていますが、わかります)には別のシステムがあります。私はIA64マシンがdlsym()/ dlopen()を使用していると思います。 –

+1

PA-RISCの32ビットHP-UXは、SOM形式(shlib_ *関数)を使用しています。これはちょっと面倒です(明らかに参照カウントはしません)。 PA-RISC上の64ビットHP-UXは、ia64上で32ビットと64ビットの両方のHP-UXと同様にELFを使用します。これらは、より純粋なdl *インタフェースを備えています。 –

関連する問題