cwindowsdllshared-librariesdlopen

Loading dll in windows C for cross-platform design


I wrote a c-code designed for linux platform. Now, I want to make it cross-platform so to use in Windows as-well. In my code, I dlopen an so file and utilize the functions inside it. Below is how my code looks like. But I just found out that in windows, the way to load and use dynamic library is quite different.

void *mydynlib
mydynlib= dlopen("/libpath/dynlib.so",RTLD_LAZY);
void (*dynfunc1)() = dlsym(mydynlib,"dynfunc1");
void (*dynfunc2)(char*, char*, double) = dlsym(mydynlib,"dynfunc2");
int (*dynfunc3)() = dlsym(mydynlib,"dynfunc3");

From what I found, I need to use LoadLibrary & GetProcAddress instead of dlopen & dlsym. However, I do not know how to convert above line for windows using those. I've tried to search some examples for hours but couldn't find exact solution. If someone had this kind of experience, please give me a tip. Excuse me if this is too obvious problem. I'm quite new to C. I usually write my program in python.


Solution

  • You could use a set of macros that change depending on the OS you're targeting:

    #ifdef __linux__
    #define LIBTYPE void*
    #define OPENLIB(libname) dlopen((libname), RTLD_LAZY)
    #define LIBFUNC(lib, fn) dlsym((lib), (fn))
    #define CLOSELIB(lib) dlclose((lib))
    #elif defined(WINVER)
    #define LIBTYPE HINSTANCE
    #define OPENLIB(libname) LoadLibraryW(L ## libname)
    #define LIBFUNC(lib, fn) GetProcAddress((lib), (fn))
    #define CLOSELIB(lib) FreeLibrary((lib))
    #endif