私はdlopenとFreeBSDの友達のマンページから読んでいます。私は、ロード可能なプラグインの共有ライブラリを使用しているクロスプラットフォームのアプリケーションに取り組んでいます。私は以前これをやったことはありませんでしたが、私はそれがどのようにうまくいくかをよく理解していると思います。マンページには共有ライブラリから関数ポインタを取得する一般的な手段であるdlsym()とvoid *を関数ポインタにキャストすることに関するコンパイラの不平を避けるdlfunc()が記載されています。 dlsym()がより一般的な理由(移植性?)がありますか?私はコンパイラの問題を避けるためにdlfunc()を使うべきか、dlsym()を使うべきか疑問に思っています。 dlfunc()は移植可能ですか?dlfuncの移植性?
1
A
答えて
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には、同等ではあるが完全に異なる方法があります。
関連する問題
- 1. JavaScriptCore移植性
- 2. パッキングデータは、移植性
- 3. FreeTTS移植性の問題
- 4. App.config dllmapエントリの移植性
- 5. nextElementSibling/nextSiblingの移植性
- 6. マッチファイルには、移植性
- 7. SQLiteライブラリ - Python移植性
- 8. std :: errc ABI移植性
- 9. Element.hidden可変移植性
- 10. ウィンドウでのLinuxのpthreadの移植性
- 11. Cのオープン(... O_DIRECT)の移植性?
- 12. .NET WebアプリケーションのSilverlightへの移植性
- 13. ファイルIOの移植性の問題
- 14. 非移植性のあるプログラム
- 15. 移植性のある可変長マクロ
- 16. Androidの最適化と移植性
- 17. $ _SERVER変数の移植性:REMOTE_USER、AUTH_USER、PHP_AUTH_USER
- 18. javafx移植アプリケーションの性能が悪い
- 19. Vici CoolStorage移植性:モノタッチ、MonoDroid、Windows Phone
- 20. $ PWDと移植性に関するpwd
- 21. OpenGL-ESで移植する移植
- 22. Python dlopen/dlfunc/dlsymラッパー
- 23. 移植アプリケーションライセンス
- 24. 移植KVMは
- 25. ゲームプラットフォームへの移植?
- 26. 移植ダフのデバイス
- 27. Webkitレイアウトエンジンの移植
- 28. ARM RealView DebuggerでAndroidを移植するための移植
- 29. SolarisとLinuxの間のsigactionとsigset_tの移植性
- 30. C++で移植性の良い精度のダブルタイムスタンプ?ここ
この場合のクロスプラットフォームはクロスPOSIXです。私は、Windowsプログラミングの暗い深みを掘り起こす欲求がほとんどありません。 – Edward
HP-UX - 少なくともPA-RISCマシン(古風に近づいていますが、わかります)には別のシステムがあります。私はIA64マシンがdlsym()/ dlopen()を使用していると思います。 –
PA-RISCの32ビットHP-UXは、SOM形式(shlib_ *関数)を使用しています。これはちょっと面倒です(明らかに参照カウントはしません)。 PA-RISC上の64ビットHP-UXは、ia64上で32ビットと64ビットの両方のHP-UXと同様にELFを使用します。これらは、より純粋なdl *インタフェースを備えています。 –