在 Racket 中具有依赖关系的 FFI?

FFI with dependencies in Racket?

我为 Wiring PI 库开发了一个非常简单的 FFI,以便能够使用 Racket 控制 Raspberry Pi。

效果很好,但只涵盖了基本功能。我想扩展它以也使用 libwiringPiDev.so 中的 lcd.h,这样我就可以创建一个 FFI 来控制 LCD。

一般情况下,编译使用LCD的C文件时,编译时会同时标记标准库和开发库:

-lwiringPi -lwiringPiDev

在我的 LCD FFI 中,我执行了以下操作:

(define-ffi-definer define-lcd
  (ffi-lib "usr/lib/libwiringPiDev.so"))

但是,当我尝试请求该球拍文件时,我 运行 进入:

; ffi-lib: couldn't open "/usr/lib/libwiringPiDev.so"
;   (/usr/lib/libwiringPiDev.so: undefined symbol: digitalRead) [,bt for
;   context]

digitalRead 函数存在于基础库中,但不存在于开发库中...我如何执行“具有依赖关系的 FFI”,以便 Racket 可以正确管理两个库以找到必要的符号?

尝试先在全局模式下加载 libwiringPi.so,然后加载 libwiringPiDev.so:

(define-ffi-definer define-lcd
  (ffi-lib "/usr/lib/libwiringPi.so" #:global? #t))
(define-ffi-definer define-lcd-dev
  (ffi-lib "/usr/lib/libwiringPiDev.so"))

#:global? #t 参数对应于在对 dlopen 的调用中设置 RTLD_GLOBAL 标志,dlopen 的手册页(在我的 Linux 系统上)说

RTLD_GLOBAL
The symbols defined by this shared object will be made available for symbol resolution of subsequently loaded shared objects.