在 Windows 和 linux 上使用 GetProcAddress() 或 dlsym() 来返回一个填充有函数指针的结构似乎可以正常工作,以便从动态库中使用。
...但是,似乎有很多人提出问题并抱怨将 void * 指针转换为函数指针,并谈论使用 dlfunc,而这种相对简单的方法似乎工作得很好。
那么,有什么特别的理由让你不想这样做吗?
由于某种原因,这样的代码是否不可移植?
我意识到这种方法仅适用于共享明确命名的函数和绑定函数,但对于加载就我而言很好的插件......?
标头.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;
来源.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
};
编辑:为了清楚起见,显然加载符号的代码在不同的平台上会有所不同,但这种方法允许共享库无需更改即可移植到不同的平台。
这就是我要问的问题,你有理由不这样做吗?
我想知道的是,是否有充分的理由不为可移植性而像这样构建共享库。