Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Возможно, вот эту функцию можно написать лучше
#include "loader.h"
#include "functions.h"
#include <stdio.h>
#ifndef WIN32
#include <dlfcn.h>
#else
#include <windows.h>
#endif
void loadRun(const char * const s) {
void * lib;
void (*fun)(void);
#ifndef WIN32
lib = dlopen(s, RTLD_LAZY);
#else
lib = LoadLibrary(s);
#endif
if (!lib) {
printf("cannot open library '%s'\n", s);
return;
}
#ifndef WIN32
fun = (void (*)(void))dlsym(lib, "run");
#else
fun = (void (*)(void))GetProcAddress((HINSTANCE)lib, "run");
#endif
if (fun == NULL) {
printf("cannot load function run\n");
} else {
fun();
}
#ifndef WIN32
dlclose(lib);
#else
FreeLibrary((HINSTANCE)lib);
#endif
}Например, вот так
#include "loader.h"
#include "functions.h"
#include <stdio.h>
#ifdef WIN32
#include <windows.h>
#define OPEN(PATH) LoadLibrary(PATH)
#define GETFN(LIB, FN) GetProcAddress((HINSTANCE) LIB, FN)
#define CLOSE(LIB) FreeLibrary((HINSTANCE) LIB)
#elifdef UNIX
// Не помню правильный заголовок,
// но UNIX-подобные содержит POSIX-совместимые заголовки,
// к которым относятся dlfcn.h
#include <dlfcn.h>
#define OPEN(PATH) dlopen(PATH, RTLD_LAZY)
#define GETFN(LIB, FN) dlsym(LIB, FN)
#define CLOSE(LIB) dlclose(LIB)
#endif
void loadRun(const char * const s) {
void * lib;
void (*fun)(void);
lib = OPEN(s);
if (!lib) {
printf("cannot open library '%s'\n", s);
return;
}
fun = (void (*)(void))GETFN(lib, "run");
if (fun == NULL) {
printf("cannot load function run\n");
} else {
fun();
}
CLOSE(lib);
}P. S. Я вообще разделил реализацию и просто выбираю правильную в CMake.
Создание и использование динамических библиотек, написанных на различных языках (C/C++, Pascal)