根据名称和签名在共享库中调用函数

时间:2011-06-13 01:30:31

标签: c++ dll programming-languages shared-libraries

我有一点DSL需要能够加载共享库并运行它们导出的函数。最后,解决了一个问题:dlopendlsymLoadLibraryGetProcAddress是跨平台使用动态库所需的全部内容。这很简单!

C ++不同意。

感谢dlsym等,我得到了我需要的一切:来自库的函数指针,来自源文件的签名表示,以及......无法使用另一个调用一个。

我只是想确认一下,如果我拥有的所有类型信息都是动态的,那么varargs,可变参数模板或其他魔法的任何技巧都无济于事。我将采用以下解决方案之一,并且还希望有哪些更好的意见(我倾向于后者)。

  • 将签名限制为接受并返回编组对象指针,并为每个将使用该语言的库编写包装器。

  • 将DSL编译为C兼容语言(读取:C ++),以便在编译时可以获得必要的信息(读取:第二次编译时)。

1 个答案:

答案 0 :(得分:3)

使用libffi来调用该功能。如果你有一个指向函数的指针,你知道它的参数&回归类型,你是金色的。 Ffi知道如何处理特定于平台的ABI,构建堆栈框架,推送参数和弹出返回值等等。

C ++ name-mangling使得这一点变得更加困难,但是如果你已经设法获得了一个函数指针,那么听起来你已经解决了这个问题......