在 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.
我为 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.