我有一点DSL需要能够加载共享库并运行它们导出的函数。最后,解决了一个问题:dlopen
,dlsym
,LoadLibrary
和GetProcAddress
是跨平台使用动态库所需的全部内容。这很简单!
C ++不同意。
感谢dlsym
等,我得到了我需要的一切:来自库的函数指针,来自源文件的签名表示,以及......无法使用另一个调用一个。
我只是想确认一下,如果我拥有的所有类型信息都是动态的,那么varargs,可变参数模板或其他魔法的任何技巧都无济于事。我将采用以下解决方案之一,并且还希望有哪些更好的意见(我倾向于后者)。
将签名限制为接受并返回编组对象指针,并为每个将使用该语言的库编写包装器。
将DSL编译为C兼容语言(读取:C ++),以便在编译时可以获得必要的信息(读取:第二次编译时)。
答案 0 :(得分:3)
使用libffi来调用该功能。如果你有一个指向函数的指针,你知道它的参数&回归类型,你是金色的。 Ffi知道如何处理特定于平台的ABI,构建堆栈框架,推送参数和弹出返回值等等。
C ++ name-mangling使得这一点变得更加困难,但是如果你已经设法获得了一个函数指针,那么听起来你已经解决了这个问题......