我正在尝试通过 FFI 使用来自 Racket 代码的 Raylib(https://www.raylib.com/,https://github.com/raysan5/raylib)。这是最简单的例子:
#lang racket
(require ffi/unsafe
ffi/unsafe/define)
; raylib shared object must be available for Racket
; for example, in Linux it must be in
; ~/.racket/<racket-version>/lib> or /usr/lib/racket
(define-ffi-definer define-raylib (ffi-lib "libraylib" #:global? #t))
(define-raylib BeginDrawing (_fun -> _void))
(define-raylib CloseWindow (_fun -> _void))
(define-raylib EndDrawing (_fun -> _void))
(define-raylib InitWindow (_fun _int _int _string -> _void))
(define-raylib SetTargetFPS (_fun _int -> _void))
(define-raylib WindowShouldClose (_fun -> _int))
(void InitWindow 640 480 "Test window")
(void SetTargetFPS 60)
(define (main-loop)
(BeginDrawing)
(EndDrawing)
(if (= (WindowShouldClose) 0)
(main-loop)
(CloseWindow)))
(main-loop)
但即使是这个非常简单的示例也会崩溃并显示以下消息:
SIGSEGV MAPERR si_code 1 fault on addr (nil)
Aborted (core dumped)
看起来它在调用 BeginDrawing()
函数时崩溃了。这个函数的代码也很简单:
// Setup canvas (framebuffer) to start drawing
void BeginDrawing(void)
{
currentTime = GetTime(); // Number of elapsed seconds since InitTimer()
updateTime = currentTime - previousTime;
previousTime = currentTime;
rlLoadIdentity(); // Reset current matrix (MODELVIEW)
rlMultMatrixf(MatrixToFloat(downscaleView)); // If downscale required, apply it here
}
带有 rl
前缀的函数是 OpenGL 包装器。可能是 OpenGL 上下文问题?
我尝试在 Guile Scheme 中调用相同的函数,在 Guile 中一切正常。
最佳答案
看起来您实际上并没有调用 InitWindow
或 SetFPS
。
代替 (void InitWindow 640 480 "Test window")
,试试 (InitWindow 640 480 "Test window")
。
关于scheme - 通过 FFI 调用 Raylib 时 Racket 中的 SIGSEGV MAPERR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54127398/