我有一个文本文件中的函数列表,我想在运行时向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);
如果这是可能的,我很想知道如何做到这一点,因为我试图通过jiting c ++来编写我的游戏引擎。我之前能够创建一些结果,但我不得不在映射中进行硬编码。我注意到Gtk使用的东西与我所要求的一致。当您使用glade并提供信号处理程序时,您在c中构建的程序将自动在由glade文件中提供的字符串引用的可执行文件中找到该函数。如果得到结果需要我调查这个Gtk的事情,我会非常高兴,但我不知道api的特性或部分是什么 - 我已经试过看了它了。我很乐意听取建议或意见。
答案 0 :(得分:4)
是的,你可以这样做。查看dlopen()
和dlsym()
的手册页:这些函数是* nix系统的标准函数,让您按名称查找符号(函数或变量)。有一个重要的问题,那就是C ++函数名称通常是“#34; mangled"编码类型信息。一种典型的方法是在extern "C" {}
块中定义一组包装函数:这些函数将是非成员的C风格函数,然后可以调用C ++代码。他们的名字不会被破坏,因此可以使用dlsym()
轻松查找。
这是一些非常标准的方式,一些插件架构可以工作。或者至少习惯于在每个人开始使用解释语言之前工作!