我为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
参数对应于RTLD_GLOBAL
在对的调用中设置标志dlopen
,而dlopen的手册页(在我的Linux系统上)说
RTLD_GLOBAL
此共享库定义的符号将可用于后续加载的共享库的符号解析。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句