我正在尝试在 Linux/Unix 系统上动态调用外部库的函数。
我在dl
库方面取得了一些成功,但只有在使用原始 C 类型并且参数按值传递时:
require 'dl/import'
module LibM
extend DL::Importer
dlload 'libm.so'
extern 'double sin(double)'
end
puts LibM.sin(3.14159265358979323846 / 2) # 1.0
但是,如果参数是存储调用结果的指针,如何使用更复杂的类型(如 C 结构)来接口函数?
module LibX11
extend DL::Importer
dlload 'libX11.so.6'
extern 'Display *XkbOpenDisplay (char *display_name, int *event_rtrn, int *error_rtrn, int *major_in_out, int *minor_in_out, int *reason_rtrn)'
end
Display
是一个很大的结构,event_rtrn
其中存储了一些结果等。
我查看了DL::CStructBuilder,它看起来可以完成这项工作,但由于文档非常简短并且没有找到工作示例,我在这里迷失了如何正确使用它。
我必须添加必须使用的标准 Ruby 1.9 模块(如果可能),因为禁止在目标机器上安装额外的 gem。