c++ - 在 Linux 中使用函数名称字符串在运行时绑定 C++ 函数
问题描述
假设在源代码中,我定义了一个静态函数void MyFun(void)
。然后我将一个字符串"void MyFun(void)"
放入配置文件中。在运行时,我想加载配置文件以获取字符串,然后创建/绑定一个指向相应静态函数的函数指针。是否有可能做这样的事情(我知道 C++ 没有反射)?
解决方案
除了维护映射之外,另一个选择是将代码编译到共享库中并使用 OS API 延迟加载符号。虽然这是依赖于 ABI 的解决方案,但在 C++ 中,您应该注意名称修改或使用 extern "C" 进行函数声明。POSIX C 示例取自https://rosettacode.org/wiki/Call_a_function_in_a_shared_library#C
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main()
{
void *mylib;
int (*myfun)(const char *);
mylib = dlopen("./mylib.so", RTLD_LAZY);
*(void **)(&myfun) = dlsym(mylib, "MyFun");
/* ... */
if (mylib) dlclose(mylib);
return EXIT_SUCCESS;
}
推荐阅读
- html - 页面对页面大小变化没有响应
- c++ - 有没有办法在运行时检测堆栈溢出?(c++)
- javascript - 两个 jQuery 块之间的作用域
- c# - Acumatica 将仅更新 CRQUOTE 中 4 个用户自定义字段中的 3 个
- pine-script - Pine 脚本如何创建警报?
- list - 如何计算 jinja 烧瓶中列表列表中的对象
- ruby-on-rails - 在 Rails 5 中将 json 作为参数管理
- typescript - 在打字稿中声明枚举给了我错误
- php - 每次页面刷新都会生成新的 CSRF 令牌,该令牌在 419 未找到页面中解析 - Laravel
- ffmpeg - 如何使用 FFMPEG 将自定义元数据添加到 MXF?