gpt4 book ai didi

c - 在windows C中加载dll进行跨平台设计

转载 作者:可可西里 更新时间:2023-11-01 11:15:30 24 4
gpt4 key购买 nike

我写了一个为 linux 平台设计的 C 代码。现在,我想让它跨平台,以便在 Windows 中使用。在我的代码中,我 dlopen 一个 so 文件并利用其中的函数。下面是我的代码的样子。但是我才发现,在windows下,加载和使用动态库的方式有很大的不同。

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");

根据我的发现,我需要使用 LoadLibrary&GetProcAddress 而不是 dlopen&dlsym。但是,我不知道如何使用这些转换 windows 的以上行。我试图搜索一些示例几个小时,但找不到确切的解决方案。如果有人有这种经历,请给我提示。如果这是一个太明显的问题,请原谅。我是 C 的新手。我通常用 python 编写程序。

最佳答案

在我年轻的时候,我创造了这样的东西:

/* dlfcn.h */

#ifndef DLFCN_H
#define DLFCN_H

#define RTLD_GLOBAL 0x100 /* do not hide entries in this module */
#define RTLD_LOCAL 0x000 /* hide entries in this module */

#define RTLD_LAZY 0x000 /* accept unresolved externs */
#define RTLD_NOW 0x001 /* abort if module has unresolved externs */

/*
How to call in Windows:

void *h = dlopen ("path\\library.dll", flags)
void (*fun)() = dlsym (h, "entry")
*/

#ifdef __cplusplus
extern "C" {
#endif

void *dlopen (const char *filename, int flag);
int dlclose (void *handle);

void *dlsym (void *handle, const char *name);

const char *dlerror (void);

#ifdef __cplusplus
}
#endif

#endif

和dlfcn.c:

/* dlfcn.c */ 

#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>

static struct {
long lasterror;
const char *err_rutin;
} var = {
0,
NULL
};

void *dlopen (const char *filename, int flags)
{
HINSTANCE hInst;

hInst= LoadLibrary (filename);
if (hInst==NULL) {
var.lasterror = GetLastError ();
var.err_rutin = "dlopen";
}
return hInst;
}

int dlclose (void *handle)
{
BOOL ok;
int rc= 0;

ok= FreeLibrary ((HINSTANCE)handle);
if (! ok) {
var.lasterror = GetLastError ();
var.err_rutin = "dlclose";
rc= -1;
}
return rc;
}

void *dlsym (void *handle, const char *name)
{
FARPROC fp;

fp= GetProcAddress ((HINSTANCE)handle, name);
if (!fp) {
var.lasterror = GetLastError ();
var.err_rutin = "dlsym";
}
return (void *)(intptr_t)fp;
}

const char *dlerror (void)
{
static char errstr [88];

if (var.lasterror) {
sprintf (errstr, "%s error #%ld", var.err_rutin, var.lasterror);
return errstr;
} else {
return NULL;
}
}

关于c - 在windows C中加载dll进行跨平台设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53530566/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com