WindowsおよびLinuxでは、GetProcAddress()またはdlsym()のいずれかを使用して、ダイナミックライブラリから使用する関数ポインターが設定された構造体を返すことは問題なく機能するようです。
...しかし、この比較的単純なアプローチがうまく機能しているように見えるときに、void *ポインターを関数ポインターにキャストしたり、dlfuncの使用について話したりすることについて、質問をしたり不平を言ったりする人は非常に多いようです。
それで、あなたがこれをしたくない特別な理由はありますか?
このようなコードは、何らかの理由で移植性がありませんか?
このアプローチは、明示的に名前が付けられた関数とバインドされた関数を共有する場合にのみ機能することを理解していますが、私に関する限り、プラグインをロードする場合は問題ありません...?
header.h:
/* C++ safety & windows support */
#ifdef __cplusplus
#if _WIN32 || _WIN64
#define __EXT extern "C" __declspec(dllexport)
#else
#define __EXT extern "C"
#endif
#else
#if _WIN32 || _WIN64
#define __EXT __declspec(dllexport)
#else
#define __EXT extern
#endif
#endif
struct a_sym_table {
int (* action) (int argc, char *argv[]);
};
__EXT struct a_sym_table liba_symbols;
source.c:
int perform_action_lib_a(int argc, char *argv[]) {
int rtn = perform_action_lib_b() + perform_action_lib_c();
return(rtn);
}
struct a_sym_table liba_symbols = {
&perform_action_lib_a
};
編集:わかりやすくするために、シンボルをロードするコードはプラットフォームによって異なりますが、このアプローチにより、共有ライブラリを変更せずにさまざまなプラットフォームに移植できます。
それは私が尋ねるときに私が話していることです、あなたがこれをしない理由はありますか?
私が知りたいのは、移植性のためにこのような共有ライブラリを構築しない正当な理由があるかどうかです。