我正在编写一种运行时系统/解释器,我需要做的一件事是调用位于外部的c/C++函数库。C/C++动态加载未知原型的函数
在linux上,我使用了dlfcn.h
函数来打开一个库,并调用一个位于其中的函数。问题是,在使用dlsysm()
时,返回的函数指针在调用之前需要转换为适当的类型,以便知道函数参数和返回类型,但是如果我在库中调用某个任意函数,显然我会在编译时不知道这个原型。
所以我问的是,有没有办法调用一个动态加载的函数,并传递它的参数,并检索它的返回值没有知道它的原型?
到目前为止,我得出的结论有没有简单的方法来做到这一点,但我已经找到了一些解决方法是:
确保所有我想要加载具有相同的功能原型,并为这些函数提供一些排序机制来检索参数和返回值。这是我目前正在做的。
使用内联asm将参数压入堆栈并读取返回值。如果可能的话,我真的想避免这样做!
如果有人有任何想法,那么将不胜感激。
编辑:
现在我发现正是我一直在寻找:
“A便携式外部函数接口库”
(虽然我承认我可以在原来的问题更清楚!)
我不明白你的声明,你不知道在编译时的函数原型。 我的意思是,你打电话给dlsym()做结果?你从哪里得到“争论”呢?争论的存在意味着 - 对我来说 - 你对函数原型有一些想法。 – 2010-07-07 12:12:00
如果您不知道参数或返回类型,如何调用函数? – Stephen 2010-07-07 12:14:08
这些函数是在不同语言的源代码中指定的,就像Java JNI一样。所以我可以很容易地得到函数的名称来调用dlysm,但参数和类型被表示为不同的AST节点,我不能简单地将它们传递给加载的函数。 – 2010-07-07 12:28:58