Skip to content

Instantly share code, notes, and snippets.

@adujardin
Created July 26, 2018 16:30
Show Gist options
  • Save adujardin/bc13e4d4419c5753d9994eb37aaf9447 to your computer and use it in GitHub Desktop.
Save adujardin/bc13e4d4419c5753d9994eb37aaf9447 to your computer and use it in GitHub Desktop.
Dynamic loading of a lib
#define MAJOR_VER 1
#define MINOR_VER 0
#ifdef _WIN32
#define WINDOWS
#endif
#ifdef WINDOWS
#include <Windows.h>
#include <delayimp.h>
#include "Psapi.h"
#pragma comment(lib, "Psapi")
#pragma comment(lib, "Kernel32")
#else
#include <dlfcn.h>
#endif
#include <iostream>
#include <stdio.h>
#ifdef WINDOWS
#define LIBAPI __stdcall
#else
#define LIBAPI
#endif
inline void * loadLibrary(const char* name) {
printf("Loading %s...\n", name);
#ifdef WINDOWS
return LoadLibrary(name);
#else
return dlopen(name, RTLD_NOW);
#endif
}
inline void (*getProcAddress(void * lib, const char *name))(void) {
#ifdef WINDOWS
return (void (*)(void)) GetProcAddress((HMODULE) lib, name);
#else
return (void (*)(void)) dlsym(lib, (const char *) name);
#endif
}
inline int freeLibrary(void *lib) {
#ifdef WINDOWS
return FreeLibrary((HMODULE) lib);
#else
return dlclose(lib);
#endif
}
#ifdef WINDOWS
std::string dlerror(){
return "error load DLL";
}
#endif
typedef int (LIBAPI *get_version_pt)(int *major, int *minor);
class Loader {
public:
Loader() {
p_lib = NULL;
get_version = NULL;
libLoaded = false;
}
~Loader() {
if (p_lib)
freeLibrary(p_lib);
}
int loadLib() {
#ifdef WINDOWS
const char* lib_name = "my_lib.dll";
#else
const char* lib_name = "libmy_lib.so";
#endif
// load library
if ((p_lib = loadLibrary(lib_name)) != NULL) {
//libLoaded = true;
} else {
fprintf(stderr, "loadLibrary: %s\n", dlerror());
return 1;
}
if ((get_version = (get_version_pt) getProcAddress(p_lib, "get_version")) == NULL) {
fprintf(stderr, "getProcAddress (get_version): %s\n", dlerror());
return 1;
} else {
int major, minor;
get_version(&major, &minor);
if (!(major == MAJOR_VER && minor == MINOR_VER)) {
printf("Incompatible my_lib version (found %d.%d, required %d.%d)\n", major, minor, MAJOR_VER, MINOR_VER);
return 1;
}
}
libLoaded = true;
return 0;
}
//private:
void* p_lib = NULL;
get_version_pt get_version = NULL;
bool libLoaded = false;
};
int main(){
Loader loader_;
loader_.loadLib();
int major, minor;
loader_.get_version(&major, &minor);
printf("my_lib version %d.%d\n", major, minor);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment