我在一个文本文件中有一个函数列表,我想在运行时向 LLVM 公开它的执行引擎,我想知道是否有可能在运行时找到指向这些函数的指针而不是硬代码所有的 GlobalMappings 都是手工制作的,因为我以后可能会添加更多。例如:
// File: InternalFunctions.txt
PushScreen
PopScreen
TopScreen
// File: ExposeEngine.cpp
// Somehow figure out the address of the function specified in a string
void* addy = magicAddress("PushScreen");
jit->addGlobalMapping(llvmfunction, addy);
如果可能的话,我很想知道如何去做,因为我正在尝试通过 jit-ing c++ 来编写我的游戏引擎。我能够更早地创建一些结果,但我必须在映射中进行硬编码。我注意到 Gtk 按照我的要求使用了一些东西。当您使用 glade 并提供信号处理程序时,您在 c 中构建的程序将自动在 glade 文件中提供的字符串引用的可执行文件中找到该函数。如果获得结果需要我研究这个 Gtk 东西,我会非常乐意,但我不知道 api 的哪些功能或部分处理这个问题——我已经尝试过查找它。我很想听听建议或建议。
最佳答案
是的,你可以做到这一点。查看 dlopen()
和 dlsym()
的手册页:这些函数是 *nix 系统上的标准函数,可让您按名称查找符号(函数或变量)。有一个重要问题,即 C++ 函数名称通常被“破坏”以编码类型信息。解决此问题的典型方法是在 extern "C"{}
block 中定义一组包装函数:这些将是非成员的 C 样式函数,然后可以调用您的 C++ 代码。它们的名称不会被破坏,因此可以使用 dlsym()
轻松查找它们。
这是一些插件架构工作的非常标准的方式。或者至少在每个人都开始使用解释性语言之前曾经工作过!
关于c++ - 如何通过字符串找到指向函数的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25947084/