首页 > 解决方案 > 在 Linux 中使用函数名称字符串在运行时绑定 C++ 函数

问题描述

假设在源代码中,我定义了一个静态函数void MyFun(void)。然后我将一个字符串"void MyFun(void)"放入配置文件中。在运行时,我想加载配置文件以获取字符串,然后创建/绑定一个指向相应静态函数的函数指针。是否有可能做这样的事情(我知道 C++ 没有反射)?

标签: c++linuxc++17

解决方案


除了维护映射之外,另一个选择是将代码编译到共享库中并使用 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;
}

推荐阅读