注意: 您正在库调用周围传递C 对象(在这种情况下为STL字符串)。有 **没有标准的C
ABI在这个水平**,所以无论是尽量避免将C
++对象周围,或确保两个资料库和程序已建成具有相同的编译器(最好在同一台机器上相同的编译器,以避免任何微妙与配置相关的惊喜。)
不要忘记在库代码中 声明导出的方法extern "C"
。
上面已经说过了,这是 一些代码,实现您要实现的目标 :
typedef std::string (*foo_t)(const std::string);foo_t foo = NULL;...# ifdef _WIN32 HMODULE hDLL = ::LoadLibrary(szMyLib); if (!hDll) { } foo = (foo_t)::GetProcAddress(hDLL, "foo");# else void *pLib = ::dlopen(szMyLib, RTLD_LAZY); if (!pLib) { } foo = (foo_t)::dlsym(pLib, "foo");# endif if (!foo) { } ... foo("bar"); ...# ifdef _WIN32 ::FreeLibrary(hDLL);# else ::dlclose(pLib);# endif您可以 进一步抽象 :
#ifdef _WIN32#include <windows.h>typedef HANDLE my_lib_t;#else#include <dlfcn.h>typedef void* my_lib_t;#endifmy_lib_t MyLoadLib(const char* szMyLib) {# ifdef _WIN32 return ::LoadLibraryA(szMyLib);# else //_WIN32 return ::dlopen(szMyLib, RTLD_LAZY);# endif //_WIN32}void MyUnloadLib(my_lib_t hMyLib) {# ifdef _WIN32 return ::FreeLibrary(hMyLib);# else //_WIN32 return ::dlclose(hMyLib);# endif //_WIN32}void* MyLoadProc(my_lib_t hMyLib, const char* szMyProc) {# ifdef _WIN32 return ::GetProcAddress(hMyLib, szMyProc);# else //_WIN32 return ::dlsym(hMyLib, szMyProc);# endif //_WIN32}typedef std::string (*foo_t)(const std::string);typedef int (*bar_t)(int);my_lib_t hMyLib = NULL;foo_t foo = NULL;bar_t bar = NULL;... if (!(hMyLib = ::MyLoadLib(szMyLib)) { } if (!(foo = (foo_t)::MyLoadProc(hMyLib, "foo")) { } if (!(bar = (bar_t)::MyLoadProc(hMyLib, "bar")) { } ... foo("bar"); bar(7); ... ::MyUnloadLib(hMyLib);


