Ada*_*ski 6 c c++ shared-libraries
我需要实现一个从.so调用函数的能力,而不需要在编译时知道函数.我将仅在运行时提供该信息.我怎样才能做到这一点?
我们可以假设我要调用的函数是从库中导出的,库侧没有什么需要做的.
编译时不知道函数签名.
操作系统是Raspberry PI上的Linux.
zwo*_*wol 11
dlopen和dlsym(或它们的Windows等价物)允许您加载其文件名在运行时确定的"共享对象"(已编译代码的模块),然后检索其名称也在运行时确定的子例程的函数指针.但是,每个这样的函数的类型签名 - 要传递的参数的数量和类型 - 必须在编译时才知道,这样您就可以将void *返回的dlsym函数转换为正确的函数指针类型,然后调用它.
如果你不知道的参数的数量和类型传递到运行时,则dlopen和dlsym是不够的,而事实上,这是现在仍然是一件事,需要手工编写汇编语言适量的.在C或C++中,即使使用通用编译器扩展,也无法合成一个在运行时确定其参数列表的调用.(GCC的扩展听起来像是这样的,但它们不够通用,除了GCC自己的运行时库的内容之外.)
幸运的是,有人已经为你编写了汇编语言并将其包装在一个很好的库中:libffi.它可靠,允许许可,并支持您可能关心的每个CPU以及更多.在x86上,它还可以方便地平滑Unix和Windows之间的一些差异.