基本上我想以独立于平台的方式在共享对象中查找一个函数:我不想处理 LoadLibrary/GetProcAddress 或 dlopen 详细信息。
是否有一个库可以隐藏在各种操作系统的共享对象中查找函数指针的过程?我只想提供共享对象/dll 名称和函数名称,并获得一个 C 函数指针来调用该函数。
基本上我想以独立于平台的方式在共享对象中查找一个函数:我不想处理 LoadLibrary/GetProcAddress 或 dlopen 详细信息。
是否有一个库可以隐藏在各种操作系统的共享对象中查找函数指针的过程?我只想提供共享对象/dll 名称和函数名称,并获得一个 C 函数指针来调用该函数。
没有库,因为使用 dlsym 或 GetProcAddress 非常简单,不值得在单独的库中分解。但它是许多图书馆的一部分。
下面是 FOX GUI 工具包中的快速复制和粘贴:
void* fxdllOpen(const FXchar *dllname){
if(dllname){
#ifndef WIN32
#ifdef HAVE_SHL_LOAD // HP-UX
return shl_load(dllname,BIND_IMMEDIATE|BIND_NONFATAL|DYNAMIC_PATH,0L);
#else
#ifdef DL_LAZY // OpenBSD
return dlopen(dllname,DL_LAZY);
#else // POSIX
return dlopen(dllname,RTLD_NOW|RTLD_GLOBAL);
#endif
#endif
#else // WIN32
return LoadLibraryExA(dllname,NULL,LOAD_WITH_ALTERED_SEARCH_PATH);
#endif
}
return NULL;
}
void fxdllClose(void* dllhandle){
if(dllhandle){
#ifndef WIN32
#ifdef HAVE_SHL_LOAD // HP-UX
shl_unload((shl_t)dllhandle);
#else // POSIX
dlclose(dllhandle);
#endif
#else // WIN32
FreeLibrary((HMODULE)dllhandle);
#endif
}
}
void* fxdllSymbol(void* dllhandle,const FXchar* dllsymbol){
if(dllhandle && dllsymbol){
#ifndef WIN32
#ifdef HAVE_SHL_LOAD // HP-UX
void* address=NULL;
if(shl_findsym((shl_t*)&dllhandle,dllsymbol,TYPE_UNDEFINED,&address)==0) return address;
#else // POSIX
return dlsym(dllhandle,dllsymbol);
#endif
#else // WIN32
return (void*)GetProcAddress((HMODULE)dllhandle,dllsymbol);
#endif
}
return NULL;
}
看看它是如何在 boost 中完成的,interprocess/detail/os_file_functions.hpp
. 这里不需要魔法#ifdef
。