gpt4 book ai didi

在 C 中创建模块系统(动态加载)

转载 作者:太空狗 更新时间:2023-10-29 16:20:51 24 4
gpt4 key购买 nike

如何在运行时加载已编译的 C 代码,然后调用其中的函数?不像简单地调用 exec()。

编辑:加载模块的程序在 C 中。

最佳答案

dlopen 是必经之路。下面是几个例子:

使用 dlopen 加载插件:

#include <dlfcn.h>
...
int
main (const int argc, const char *argv[])
{

char *plugin_name;
char file_name[80];
void *plugin;
...
plugin = dlopen(file_name, RTLD_NOW);
if (!plugin)
{
fatal("Cannot load %s: %s", plugin_name, dlerror ());
}

编译以上内容:

% cc  -ldl -o program program.o 

然后,假设这个 API 用于插件:

/* The functions we will find in the plugin */
typedef void (*init_f) ();
init_f init;
typedef int (*query_f) ();
query_f query;

找到插件中init()的地址:

init = dlsym(plugin, "init");
result = dlerror();
if (result)
{
fatal("Cannot find init in %s: %s", plugin_name, result);
}
init();

使用另一个函数 query(),它返回一个值:

query = dlsym (plugin, "query");
result = dlerror();
if (result)
{
fatal("Cannot find query in %s: %s", plugin_name, result);
}
printf("Result of plugin %s is %d\n", plugin_name, query ());

您可以检索完整示例 on line .

关于在 C 中创建模块系统(动态加载),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384121/

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